您的位置:首页 > 编程语言 > C语言/C++

《effective C++》读书笔记

2014-10-01 01:49 225 查看
条款3:尽可能使用const

1、const int *  a;   int const *a;这两个都是修饰数据类型int的所以是指向一个常数据
     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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  C++ 读书笔记