Professional C++读书笔记04

2012-05-18

Chapter08

1、初始化列表:允许在创建数据成员的同时完成数据成员的初始化

         语法:以冒号开头,以逗号做分隔符,每个元素分别对一个数据成员初始化,可以使用函数记法

         例:SpreadsheetCell::SpreadsheetCell():mValue(0),mString(“”);

         注:在构造函数体内为一个对象赋值时,并没有真正构造该对象(这些数据成员已经初始化),这一点与初始化列表不同

         注:初始化列表按类定义中数据成员声明的顺序进行初始化,而非初始化列表中的顺序

2、将对象按const引用来传递,而不是按值来传递

         按const引用效率更高,只会复制对象的地址,而不会复制对象的整个内容

3、

如果定义了。。。

编译器会生成。。。

可以创建

举例

未定义构造函数

一个0参

一个复制构造函数

不带参数

作另一个对象的副本

SpreadsheetCell cell;

SpreadsheetCell mycell (cell);

仅一个0参构造函数

一个复制构造函数

不带参数

作另一个对象的副本

SpreadsheetCell cell;

SpreadsheetCell mycell (cell);

仅一个复制构造函数

理论上可以做另一个对象的副本,实际上不能创建任何对象

无(没办法创建第一个对象)

仅一个单参或多参构造函数(非复制)

一个复制构造函数

带参数

作另一个对象的副本

SpreadsheetCell cell(6);

SpreadsheetCell mycell (cell);

一个零参和一个单参构造函数

一个复制构造函数

不带参数

带参数

做另一个对象的副本

SpreadsheetCell cell;

SpreadsheetCell cell(6);

SpreadsheetCell mycell (cell);

4、对于栈上的对象,如果出了作用域,对象会自动撤销,按声明的逆序撤销

         堆上分配的对象不会自动撤销,必须对对象指针调用delete,从而调用析构函数,并释放内存

5、在C++中,复制只在对象初始化时才会出现,其余成为赋值

         赋值运算符:为了实现a=b=c的赋值,assignment operator应该返回一个对象的引用

         等号不一定表示赋值:当用在变量声明的时候,也可能是复制构造函数的简写

         如SpreadsheetCell aCell=myCell    //这就是复制构造函数

6、赋值运算符

         1),检查自赋值的情况

         2),若牵涉到指针,则应该先释放原有内存,并根据rhs的大小重新分配内存

         3),返回一个对象的引用,即*this

7、string s;

         s=str.getString();     //同一行既调用了赋值运算符(对于s),又调用了复制构造函数(对于str)

         getString返回一个string,编译器会调用一个复制构造函数创建一个临时string对象

         string s2=str.getString();                   //s2与str均调用了复制构造函数

posted on 2012-06-04 23:10  TheBest  阅读(152)  评论(0编辑  收藏  举报

导航