拷贝函数调用时机

  • c++中拷贝构造函数调用时机通常有三种情况

    (1)使用一个已经创建完毕的对象来初始化一个新对象

    (2)值传递的方式函数参数传值

    (3)以值方式返回局部对象

示例:

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
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
#include<iostream>
using namespace std;


//3、以值方式返回局部对象
class Person {
public:
Person() {
cout << "Person 的默认构造函数调用。" << endl;
}
Person(int a) {
age = a;
cout << "Person 的有参构造函数调用。" << endl;
}
Person(const Person &p) {
age = p.age;
cout << "Person 的拷贝构造函数调用。" << endl;
}

~Person() {
cout << "Person 的析构函数调用。" << endl;
}
int age;
};
//使用一个已经创建完毕的对象来初始化一个新对象
void test01() {
Person p1(10);
Person p2(p1);
cout << "p2 的年龄为:" << p2.age << endl;
}
//值传递的方式函数参数传值
void dowork(Person p) {

}
void test02() {
Person p;
dowork(p);
}
//值方式返回局部对象
Person dowork2() {
Person p1;//默认构造函数
cout << (int)&p1 << endl;
return p1;
}
void test03() {
Person p = dowork2(); //拷贝构造函数,相当于Person p = p1;,拷贝之后在析构 dowork2 函数返回的局部对象
cout << (int)&p << endl;
}
int main() {
cout << "test01" << endl;
test01();
cout << "\ntest02" << endl;
test02();
cout << "\ntest03" << endl;
test03();
return 0;
}

运行结果:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
test01
Person 的有参构造函数调用。
Person 的拷贝构造函数调用。
p2 的年龄为:10
Person 的析构函数调用。
Person 的析构函数调用。

test02
Person 的默认构造函数调用。
Person 的拷贝构造函数调用。
Person 的析构函数调用。
Person 的析构函数调用。

test03
Person 的默认构造函数调用。
17823492
Person 的拷贝构造函数调用。
Person 的析构函数调用。
17823740
Person 的析构函数调用。