这是小编第一次接触拷贝构造函数,对于一个新概念,我总希望得到一个特别的解释,对于我来说,只有这样才能印象深刻.

Code

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
#include <iostream>
using namespace std;
static int g_dog_counter;
class Dog
{
public:
Dog()
{
g_dog_counter++;
cout<<"Dog::Dog(),g_dog_counter="<<g_dog_counter<<endl;
}
~Dog()
{
g_dog_counter--;
cout<<"Dog::~Dog(),g_dog_counter="<<g_dog_counter<<endl;
}
};
Dog GrobalFunction(Dog dog)
{
cout<<"GrobalFunction()"<<endl;
return dog;
}
int main() {
Dog dog1;
Dog dog2=GrobalFunction(dog1);
return 0;
}

Error

1
no error

结果输出:

1
2
3
4
5
Dog::Dog(),g_dog_counter=1
GrobalFunction()
Dog::~Dog(),g_dog_counter=0
Dog::~Dog(),g_dog_counter=-1
Dog::~Dog(),g_dog_counter=-2

这个结果很奇怪,构造函数和析构函数没有一一对应.

Analysis

理想的最终结果是g_dog_counter=0
第一行输出:dog1的构成函数
第三行输出:GrobalFunction函数类构造了一个对象,但是没有使用默认构造函数构造,却使用了默认的析构函数
第四行输出:dog1的析构函数
第五行输出:dog2的析构函数
那么是谁在GrobalFunction函数里构造了对象了?
答案是拷贝构造函数:Dog(const Dog& dog)
在Dog类加入如下代码:

1
2
3
4
5
Dog(const Dog& dog)
{
g_dog_counter++;
cout<<"Dog::Dog(const Dog& dog)"<<endl;
}

会得到如下结果:

1
2
3
4
5
6
7
Dog::Dog(),g_dog_counter=1
Dog::Dog(const Dog& dog)
GrobalFunction()
Dog::Dog(const Dog& dog)
Dog::~Dog(),g_dog_counter=2
Dog::~Dog(),g_dog_counter=1
Dog::~Dog(),g_dog_counter=0

这才是我们理想中的结果.

Summary

纯粹是为了引入拷贝构造函数这个概念.