Effective C++ 小笔记:条款3-6
Effective C++ 条款3
1、在一个函数声明式内,const可以和函数返回值、各参数、函数自身(如果是成员函数)产生关联。
2、许多人漠视一个事实:两个成员函数如果只是常量性(constness)不同,可以被重载。这实在是一个重要的C++特征。包括const修饰成员函数本身,或者成员函数的返回值。
3、const成员函数不可以更改对象内任何non-static成员变量。
4、在一个成员函数里,static_cast<char&>(static_cast<const TextBlock&>(*this)[position]); 因为static_cast和[]操作符同优先级,所以结合性决定是先进行那个运算,因为它们的结合性都为从左到右,所以cast操作先于[]执行。
5、编译器强制实施bitwise constness(事实上的常量性),但你编写程序时应该使用“概念上的常量性”。后者是说const成员函数有时可以更改某些成员变量,这些需要被const成员函数更改的变量就可以声明为mutable。(P23 effective C++)。
Effective C++ 条款4
1、永远在使用对象之前先将它初始化。对于任何类成员的内置类型,你必须手工完成此事。至于内置类型以外的任何其他东西,初始化责任落在构造函数身上。规则很简单:确保每一个构造函数都将对象的每一个成员初始化。即使成员是内置类型,你也需要在成员初始化列表里面将其初始化,因为有的时候如果内置类型是const或者reference,他们就必须初始化,而不能被赋值。
2、因为vector、list、deque等顺序容器是模板类,一旦制定了其存储的类型,如list<int> myList; 那么myList就是一个类的对象了。自然就可以直接用来对另一个类型相同的list赋值。如,list<int> hisList = myList;调用的是类的copy构造函数?
3、C++有着十分固定的“成员初始化次序”。次序总是相同的:base classes更早于derived classes,而class的成员变量总是以其声明次序被初始化。
Effective C++ 条款5、6
1、什么时候empty class(空类)不再是个空类呢?当C++处理过它之后。是的,如果你自己没有声明,编译器就会为它声明(编译器版本的)一个copy构造函数、一个copy assignment操作符和一个析构函数。此外如果你没有声明任何构造函数,编译器也会为你声明一个default构造函数。所有这些函数都是public且inline。注意,惟有当这些函数被需要(被调用),它们才会被编译器创建出来。
2、注意copy构造函数和copy assignment操作符的形参都有const限定,并且都是引用。copy assignment操作符返回自身的引用。
3、有的时候,编译器会拒绝为类产生copy assignment操作符:
一,内含reference成员或者const成员的类。
二,如果某个base classes将copy assignment操作符声明为private,编译器拒绝为其derived classes生成一个copy assignment操作符。毕竟编译器为derived class 所生的copy assignment操作符想象中可以处理base class成分,但它们无法调用derived class无权调用的成员函数。
4、有的时候某些类的对象没有相同的对象。如房子HomeForSale类。所以有必要禁止这样的类被复制。也就是禁止编译器为这样的类自动生成copy构造函数、copy assignment操作符。为实现这个功能,可以将相应的函数声明为private并且不予实现。连空函数体都不必要,只需要在类定义中将方法声明为private,并且没有必要写出形参的名称。一般而言,这个方法并不绝对安全,因为menber函数和friend函数还是可以调用你的private函数。C++ iostream库中的类使用这个方法来阻止copy行为。
除此之外,还有一个方法:定义一个辅助基类Uncopyable,其中将它的copy构造函数和copy assignment操作符声明为private,可以不予实现(不定义)。