Effiective C++笔记
不闻窗外事
学无止境
展开
-
条款13:以对象管理资源
Use objects to manage resources假设我们使用一个将用来塑模投资行为的程序库,其中各式各样的透支类型继承自一个root class Investment,进一步假设,这个程序库通过一个工程函数供应我们某特定的Investment对象:Investment * createInvestment(); //返回指针,指向Inves继承体系内的动态分配对象。调用者有...原创 2020-01-07 18:07:31 · 125 阅读 · 0 评论 -
条款09:绝不在构造和析构过程中调用virtual函数
Never call virtual function during construction or destruction.本条款开始前我要先阐述重点:你不该在构造函数和析构函数期间调用virtual函数,因为这样的调用不会带来你预想的结果,就算有你也不会高兴。如果你同时也是一位java或C#程序员,情更加注意本条款,因为这时C++与它们不相同的地方。假设你有个class继承体系,用来塑模股...原创 2019-10-25 11:16:24 · 187 阅读 · 0 评论 -
条款07:为多态基类声明virtual析构函数
Declare destructors virtual in polymorphic base classes.有许多种做法可以记录时间,因此,设计一个TimeKeeper base class和一些derived classes作为不同的计时方法,相当合情合理:class TimeKeeper {public: TimeKeeper(); ~TimeKeeper();...原创 2019-10-25 09:54:45 · 140 阅读 · 0 评论 -
条款12:复制对象时勿忘其每一个成分
Copy all parts of an objec设计良好之面向对象系统(OO-systems)会将对象的内部封装起来,只留两个函数负责对象拷贝,那便是带着适切名称的copy构造函数和copy assignment操作符,我称他们为copying函数。编译器会在必要时为我们的classes创建copying函数,并说明这些“编译器生成版”的行为:将被拷对象的所有成员变量都做一份拷贝。如果...原创 2019-10-18 19:05:05 · 151 阅读 · 0 评论 -
导读
本书的目的是告诉你如何有效运用C++。这里提供的是这个语言的使用导引,是你的软件易理解、易维护、可移植、可扩充、高效、并且有着你所预期的行为。术语:所谓声明式(declaration)是告诉编译器某个东西的名称和类型(type),但略去细节。下面都是声明式:extern int x; //对象声明式std::size_t numDigits(int number); //对象声明式...原创 2019-08-30 15:15:12 · 86 阅读 · 0 评论 -
条款11:在operator=中处理“自我赋值”
Handleassignment to self in operator=."自我赋值"发生在对象被赋值给自己时:class Widget {...};Widget w;w = w;赋值动作并不总是那么可被一眼识别出来,例如: a[i] = a[j]; //如果i和j相同,这边是自我赋值 *px = *py; //如果px和py恰巧指向同一个东西,也是自我赋值。...原创 2019-10-11 17:55:48 · 186 阅读 · 0 评论 -
条款10:令operator=返回一个reference to *this
Have assignment operators return a reference to *this.关于赋值,有趣的是你可以把它们写成连锁形式: int x, y, z; x = y = z = 15;同样有趣的是,赋值采用右结合律,所有上述连锁赋值被解析为: x = (y = (z = 15));这里15先被赋值给z,然后其结果再被赋值给y,然后其结果再被...原创 2019-10-11 16:13:15 · 159 阅读 · 0 评论 -
条款08:别让异常逃离析构函数
Prevent exceptions from leaving destructorsC++并不禁止析构函数吐出异常,但不鼓励你这样做。考虑以下代码:class Widget{public: ... ~Widget(){...} //假设这个可能吐出一个异常};void doSomething(){ std::vector<Widget> v; ....原创 2019-09-17 19:45:21 · 102 阅读 · 0 评论 -
条款06:若不想使用编译器自动生成的函数,就该明确拒绝
Explicitly disallow the use of compiler-generated functions you do not want.通常如果你不希望class支持某一特定的机能,只要不声明对应函数就是了。但这个策略对copy构造函数和copy assignment操作符却不起作用,因为如果你不声明它们,而某些人尝试调用它们,编译器会为你声明它们。答案的关键是,所有编译器...原创 2019-09-30 14:51:00 · 112 阅读 · 0 评论 -
条款05:了解C++默默编写并调用哪些函数
Know what functions C++ silently writes and calls什么时候empty class不再是empty class呢?当C++处理过它之后。如果你没有声明,编译器就会为它声明一个copy构造函数,一个copy assignment操作符和一个析构函数。此外,如果你没有声明任何构造函数,编译器也会为你声明一个default构造函数。所有这些函数都是pub...原创 2019-09-17 19:03:42 · 107 阅读 · 0 评论 -
条款04:确定对象被使用前先被初始化
Make sure that objects are initialized before they're used通常如果你使用C part of C++(见条款1)而且初始化可能招致运行期成本,那么不保证发生初始化。一旦进入non-C parts of C++,规则有些变化。这就很好地解释了为什么array(来自C part of C++)不保证其内容被初始化,而vector却有此保证。...原创 2019-09-06 19:10:02 · 131 阅读 · 0 评论 -
条款03:尽可能使用const
Use const whenever possible面对指针,你可以指出指针自身、指针所指物,或两者都(或都不)是const;如果关键字const出现在星号左边,表示被指物是常量;如果出现在星号右边,表示指针自身是常量;如果出现在星号两边,表示被指物和指针两者都是常量。char greeting[] = "Hello";char *p = greeting; //非常量const ...原创 2019-09-05 20:00:01 · 97 阅读 · 0 评论 -
条款02:尽量以const、enum、inline替换#define
Prefer consts,enums,and inlines to #defines.#define ASPECT_RATIO 1.653记号名称ASPECT_RATIO也许从未被编译器所见;也许在编译器开始处理源码之前他就被预处理器移走了。于是记号名称ASPECT_RATIO有可能没进入记号表(symbol table)内。于是当你运用此常量但获得一个编译错误信息时,可能会带来困惑,因...原创 2019-08-30 18:09:54 · 131 阅读 · 0 评论 -
条款1:视C++为一个语言联邦
View C++ as a federation of languages.今天的C++已经是个多重范型编程语言(multiparadigm programming language),一个同时支持过程形式(procedural)、面向对象形式(object-oriented)、函数形式(functional)、泛型形式(generic)、元编程形式(metaprogramming)的语言。这...原创 2019-08-30 15:56:00 · 1110 阅读 · 0 评论