目录
1 让自己习惯C++
Item1:将C++视为federation of languages
Item2:用consts、enums和inlines取代#define
Item3:尽可能的使用const
Item4:确定对象被使用前已经先被初始化
2 构造、析构和赋值运算
Item5:了解C++默认编写并调用哪些函数
Item6:若不想使用编译器自动生成的函数,就该明确拒绝
Item7:为多态基类声明virtual析构函数
Item8:别让异常逃离析构函数
Item9:绝不在构造和析构过程中调用virtual函数
Item10:令oprator=返回一个reference to *this
Item11:令oprator=中需要考虑自我赋值
Item12:复制对象时勿忘其每一个成分
Item13:以对象管理资源
Item14:在资源管理类中小心coping行为
Item15:在资源管理类中提供对原始资源的访问
Item16:成对使用new和delete时要采用相同形式。
Item17:以独立语句将newed对象置入智能指针。
Item18:让接口容易被正确使用,不易被误用。
Item19:设计classs犹如设计type。
Item20:宁以pass-by-reference-to-const替换pass-by-value。
Item21:必须返回对象时,别妄想返回其reference。
Item22:将成员变量声明为private。
Item23:宁以non-member non-friend函数代替member函数。
Item24:若所有参数皆需要类型转换,请为此采用non-member函数。
Item25:考虑写出一个不抛异常的swap
限定作用于,会放在常量区,但枚举不占用对象的存储空间,除非是枚举变量。
const成员函数,相当于const this对象,可以操作const对象和不改变对象,两个成员函数如果只是常量性不同可以重载。
const写在类型之前或者类型之后都是可以的,表示指物是常量,也就是指针常量
const int *a;
int const *a;
1、初始化列表经常用于自定义类,但const、references成员变量也要用初始化列表初始化。
2、C++对定义于不同的编译单元内的non-local static 对象的初始化相对次序没有明确定义。
编译器可以暗自为class创建default构造函数、copy构造函数、copy assignment操作符以及析构函数。
将成员函数声明为private而且故意不实现他们。
只要当class内含有至少一个virtual函数,它就应该拥有一个virtual析构函数
polymorphic(带多态性质的)base class应该声明一个virtual析构函数。
在base classs构造期间,virtual函数不是virtual函数。
对象在derived class构造函数开始执行之前不会成为一个deriver class队形。
异常安全一般自动获得自我赋值安全的回报
Copying函数应该确保复制“对象内的所有数据成员变量”以及所有“base class成分”.
不要尝试以某个copy函数去实现灵一个copy函数,应当将共同机能放进第三个函数中,并有两个copy构造函数和copy assignment函数使用,消除共同代码。
获得资源后立即放进管理对象,Resource Acquisition Is Initialization(RAII)。
对原始资源的访问可以显示转换或隐式转换,一般而言显示转换比较安全,但隐式转换对客户比较方便。
尽量以pass-by-reference-to-const替换pass-by-value,前者通常比较高效,并可避免切割问题。
以上规则并不适用于内置类型,以及STL的迭代器和函数对象,对它们而言,pass-by-value往往比较合适。
只有当参数位于参数列,这个参数才是隐式类型转换的合格参与者。但记住类型转换函数和转换构造函数一般只有一个,此处指的是转换构造函数
我们通常不能够(不被允许)改变std命名空间内的任何东西,但可以被允许为标准的templates(如swap)制造特化版本,使它专属于我们自己的classes。
class Widget {
public:
void swap(Widget &other){
using std::swap;
swap(pImple,other.pImpl);
}
};
template(typename T>
void swap(Widget& a,Widget& b){
a.swap(b);
}
namespace std{
template
void swap( T& a, T& b ){
T temp(a);
a = b;
b = temp;
}
template//重载,但不能加入到std中
void swap(Widget& a,Widget& b){
a.swap(b);
}
template<>//全特化
void swap(Widget &a,Widget &b){
a.swap(b);
}
}