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

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

2011-12-20 11:29 197 查看

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

class Inner{
public:
Inner(){}
Inner(const Inner &inner){
cout << "Inner Copy Constructor.\n";
}
};

class Sub : public Super{
private:
Inner in;
};

int main(){
Sub sub1;
Sub sub2 = sub1;
}

输出结果如下:

Super Copy Constructor.

Inner Copy Constructor.

实现自己的拷贝构造函数

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

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

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

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

以后要看的

1. 在汇编的层次上理解函数调用栈及其调用过程。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: