条款3:尽可能使用const
1、const int * a; int const *a;这两个都是修饰数据类型int的所以是指向一个常数据
3、令函数返回一个常量值 往往可以降低客户错误而造成的意外 例如 const Rational operator*(const Rational& lhs,const Rational& rhs) (a*b)=12 XXX
int*const p=a;这是一个指向不可以改变的常指针
2、STL里面:
const
vector
<
int
> ::
iterator
vIntIter = vInt.begin();
//不可以改变指向
vector
<
int
>::
const_iterator
cConstIntIter = vInt.begin();
//指向的内容不可以用
3、令函数返回一个常量值 往往可以降低客户错误而造成的意外 例如 const Rational operator*(const Rational& lhs,const Rational& rhs) (a*b)=12 XXX
条款4:确定对象被使用前先被初始化
1、对象的构造函数 注意初始化和赋值的区别
初始化是在构造函数之前,用参数列表来语法实现的,ABEntry::ABEntry(const std::name& name):theName(name)//初始化{
//赋值}
在初始化的时候会调用成员变量的构造函数 例如例子里面就会调用string 的copy函数
这样效率会提高,因为在初始化时候调用成员变量构造函数的时候就进行赋值操作
2、初始化成员列表不代表初始化顺序 而是根据成员变量的申明顺序
3、static对象 全局成员和static变量 他们会在main函数结束的时候被调用 调用析构函数
使用单例模式来解决这个问题:
FIleSystem& tfs()
{
static FileSystem fs;
return fs;
}======》reference-returning函数 第一行定义初始化一个static变量 第二行返回它
用来防止”初始化次序问题“
4、全局变量和静态变量的区别 可以被extern吗 局部静态变量则是作用域的区别 函数外面调用不到函数里面的局部静态变量
【记住】:
【1】为内置型对象(int float)进行手工初始化,因为C++不保证初始化它们
【2】构造函数最好使用成员初值列表,而不要在构造函数本体内使用赋值操作
【3】为避免”跨编译单元之初始化次序“问题,使用local static对象替换non-static对象
条款5:Know what function C++ silently writes and calls
1、编译器会自动为class申明一个copy构造函数、一个copy assignment操作符和一个析构函数 此外如果你没有申明任何构造函数,编译器也会自动为你申明一个default构造函数 所有这些函数都是public而且是inline
2、编译器自动生成的copy构造函数和copy assignment函数的做法是调用成员变量的copy函数 内置类型就拷贝值
【注】:引用初始化的时候就要赋予一个引用 之后就不可以更改了
3、如果成员变量中有引用,那么默认的copy构造函数应该怎么copy这个引用类型的变量呢? 还有常量,不可以改变了。
解决办法:必须自己定义copy函数和copy assignment操作符
把父类的赋值构造函数申明为privae