一、引用(reference)
引用的规则
1. 当引用被创建时它必须被初始化。
2. 一旦一个引用被初始化为一个对象,它就不能改变为另一个对象的引用。
3. 不能有NULL引用。必须确保引用和一块合法的存储单元关联。
怎样选择引用和指针
在下面两种情况下应使用指针:
1. 存在不指向任何对象的可能,这种情况下你可能将指针设置为NULL;
2. 你需要在不同的时刻指向不同的对象。
反之,如果总是指向一个对象,并且一旦指向一个对象后就不会改变指向,这种情况下应该使用引用。
二、拷贝构造函数
什么时候需要拷贝构造函数
仅当需要按值传递的方式传递一个类对象时,我们才需要拷贝构造函数。
什么时候需要自定义的拷贝构造函数
1. 当拷贝构造函数除了拷贝外,还要做一些额外的事情时,需要自定义;
2. 当类中包含指针成员时,需要自定义。因为默认的拷贝构造函数只拷贝指针,是浅拷贝。
默认的拷贝构造函数是什么样的
编译器递归地为所有基类和所有的成员对象调用拷贝构造函数。可以写一段代码验证一下:
1 #include <iostream>
2 using namespace std;
3
4 class Super{
5 public:
6 Super(){}
7 Super(const Super &super){
8 cout << "Super Copy Constructor.\n";
9 }
10 };
11
12 class Inner{
13 public:
14 Inner(){}
15 Inner(const Inner &inner){
16 cout << "Inner Copy Constructor.\n";
17 }
18 };
19
20 class Sub : public Super{
21 private:
22 Inner in;
23 };
24
25 int main(){
26 Sub sub1;
27 Sub sub2 = sub1;
28 }
2 using namespace std;
3
4 class Super{
5 public:
6 Super(){}
7 Super(const Super &super){
8 cout << "Super Copy Constructor.\n";
9 }
10 };
11
12 class Inner{
13 public:
14 Inner(){}
15 Inner(const Inner &inner){
16 cout << "Inner Copy Constructor.\n";
17 }
18 };
19
20 class Sub : public Super{
21 private:
22 Inner in;
23 };
24
25 int main(){
26 Sub sub1;
27 Sub sub2 = sub1;
28 }
输出结果如下:
Super Copy Constructor.
Inner Copy Constructor.
实现自己的拷贝构造函数
当你由于某种原因需要实现自己的拷贝构造函数时,需要记住拷贝类中的某一部分。具体如下:
1. 调用基类的拷贝构造函数。如果你不这样做,编译器会偷偷地调用基类的默认构造函数,而不是拷贝构造函数。
2. 调用成员的拷贝构造函数。如果你不这样做,编译器会调用成员的默认构造函数,而不是拷贝构造函数。
3. 对指针成员进行深拷贝。
以后要看的
1. 在汇编的层次上理解函数调用栈及其调用过程。