【C++】拷贝构造函数的调用时机


拷贝构造函数的调用时机通常有三种

  1. 使用一个已经创建完成的对象来初始化一个新对象
  2. 以值传递的方式给函数的参数传值
  3. 以值的方式返回局部对象 

下方所有文本均以此代码为基础

 1 class Person {
 2 public:
 3     Person() {
 4         cout << "无参构造函数" << endl;
 5         mAge = 10;
 6     }
 7     
 8     Person(int age) {
 9         cout << "有参构造函数" << endl;
10         mAge = age;
11     }
12     Person(const Person& p) {
13         cout << "拷贝构造函数" << endl;
14         mAge = p.mAge;
15     }
16     
17     ~Person() {
18         cout << "析构函数!" << endl;
19     }
20     int mAge;
21 };
点我查看
  • 使用一个已经创建完成的对象来初始化一个新对象

1 void test01(){
2     Person p1(10);//创建完的对象p1
3     Person p2(p1);//调用拷贝构造函数
4 }

注意: Person p2=p1;会调用拷贝构造函数

而Person p2;p2=p1;不会调用拷贝构造函数,为赋值操作

  • 以值传递的方式给函数的参数传值

1 void doWork(Person p){
2     
3 }
4 
5 void test02(){
6     Person p1;//创建对象
7     doWork(p1);调用函数,并将对象p1传入
8 }
  • 以值的方式返回局部对象

1 Person doWork02(){
2     Person p;
3     return p;
4 }
5 
6 void test03(){
7     Person p1 = doWork02();
8 }

注意: 这种有个专门的优化,当你的函数返回一个自定义类的对象的时候,编译器可以优化掉返回这个过程,可以简单认为这期间只创建了一次对象,所以不会调用拷贝构造函数

  • 全部代码

 1 #include 
 2 using namespace std;
 3 
 4 class Person {
 5 public:
 6     Person() {
 7         cout << "无参构造函数" << endl;
 8         mAge = 10;
 9     }
10     
11     Person(int age) {
12         cout << "有参构造函数" << endl;
13         mAge = age;
14     }
15     Person(const Person& p) {
16         cout << "拷贝构造函数" << endl;
17         mAge = p.mAge;
18     }
19     
20     ~Person() {
21         cout << "析构函数!" << endl;
22     }
23     int mAge;
24 };
25 
26 void test01(){
27     Person p1(10);
28     Person p2;
29     p2=p1;
30     
31 }
32 
33 void doWork01(Person p){
34     
35 }
36 
37 void test02(){
38     Person p1;
39     doWork01(p1);
40 }
41 
42 
43 Person doWork02(){
44     Person p;
45     return p;
46 }
47 void test03(){
48     Person p1 = doWork02();
49 }
50 
51 
52 int main(){
53     test01();
54     test02();
55     test03();
56 }

2022-06-21 10:17:01