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均调用了复制构造函数