Thinking in C++ 第11章 引用和拷贝构造函数

一、引用(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 }

输出结果如下:

Super Copy Constructor.

Inner Copy Constructor.

 

实现自己的拷贝构造函数

当你由于某种原因需要实现自己的拷贝构造函数时,需要记住拷贝类中的某一部分。具体如下:

1. 调用基类的拷贝构造函数。如果你不这样做,编译器会偷偷地调用基类的默认构造函数,而不是拷贝构造函数。

2. 调用成员的拷贝构造函数。如果你不这样做,编译器会调用成员的默认构造函数,而不是拷贝构造函数。

3. 对指针成员进行深拷贝。

以后要看的

1. 在汇编的层次上理解函数调用栈及其调用过程。

原文地址:https://www.cnblogs.com/hdtianfu/p/2294454.html