【C++】拷贝构造函数的调用时机
拷贝构造函数的调用时机通常有三种
- 使用一个已经创建完成的对象来初始化一个新对象
- 以值传递的方式给函数的参数传值
- 以值的方式返回局部对象
下方所有文本均以此代码为基础
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 #include2 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