天天看点

C++ Primer Plus学习笔记之拷贝构造函数C++ Primer Plus学习笔记之拷贝构造函数

1,什么是拷贝构造函数

拷贝构造函数有两个含义:

首先,它是一个构造函数,当创建一个新对象时,系统自动调用它;

其次,它将一个已经定义过的对象的数据成员逐一对应的复制给新对象;

如果一个类没有显式定义拷贝构造函数,c++编译器可以为该类产生一个缺省的拷贝构造函数。这个缺省的拷贝构造函数采用c的方式,将拷贝对象的内存一个字节一个字节的拷贝到拷贝对象的内存中(内存拷贝);

2,拷贝构造函数的作用

(1)创建一个新对象,并将一个已存在的对象拷贝到这个新对象;

(2)对象的值做参数(将实参对象拷贝到形参对象);

(3)函数返回一个对象(拷贝返回的一个对象给一个临时对象);

3,为什么需要拷贝构造函数

我们往往会忽略为一个类显式地提供拷贝构造函数。此时c++编译器可以为该类产生一个缺省的拷贝构造函数。这个缺省的拷贝构造函数采用c的方式,将拷贝对象的内存一个字节一个字节的拷贝到拷贝对象的内存中(内存拷贝)。这样一来,新对象和老对象的内存映像是一模一样的,我们可以说,新对象是老对象的“克隆体”;

在一般情况下,这个缺省的拷贝构造函数工作得很好,但是,在一些特殊的情况下,它却表现得有问题。

请看下面的例子:

我们需要统计一个类在程序运行过程中一共实例化出对少个对象。这个工作我们可以在类中加入一个静态变量,并且在该类的构造函数中自增该变量,然后在析构函数中减计数。很明显,如果计数以0开始,那么程序结束时以0结尾。

运行结果:

in constructor...

point count=1

in fun()...

point count=1,此时已经出错了,因为此时内存中不仅存在着p1对象,还存在着临时对象形参p;

after object destroyed...

point count=0

after point2 create...

point count=-1

point count=-2

解决问题的方法相当直观,就是为point类提供一个显示 的拷贝构造函数。

point count=1       p1形成

..........................................................

in copy constructor...

point count=2

point count=2      形参p拷贝实参p1的结果

.........................................................

point count=3      p2接受fun返回的结果

........................................................

point count=2      形参p销毁

point count=2      p2形成

point count=1      p2销毁

point count=0    

p1销毁

继续阅读