[url=][/url]
1 #include<iostream> 2 using namespace std; 3 class A{ 4 public: 5 int a; 6 A(int value){ 7 a = value; 8 } 9 void show(){10 cout<<a<<endl;11 }12 }; 13 int main(){14 A test_a(10);15 test_a.show();16 17 A test_b(test_a);18 test_b.show();19 20 return 0;21 }[url=][/url]
1010
[url=][/url]
1 #include<iostream> 2 using namespace std; 3 class A{ 4 public: 5 int a; 6 A(int value){ 7 a = value; 8 } 9 A(A& tmp){10 a = tmp.a;11 cout<<"call copy construct"<<endl;12 }13 void show(){14 cout<<a<<endl;15 }16 }; 17 int main(){18 A test_a(10);19 test_a.show();20 21 A test_b(test_a);22 test_b.show();23 24 return 0;25 }[url=][/url]
10call copy construct10
拷贝构造函数被调用的三种情况
1 A test_b(test_a);2 A test_b = test_a;
注意,第二条语句是初始化语句,不是赋值语句。赋值语句的等号左边是一个早已有定义的变量,赋值语句不会引发拷贝构造函数的调用。例如:
1 A test_a,test_b;2 test_b = test_a;
[url=][/url]
1 #include<iostream> 2 using namespace std; 3 class A{ 4 public: 5 int a; 6 A(int value){ 7 a = value; 8 } 9 A(A& tmp){10 a = tmp.a;11 cout<<"call copy construct"<<endl;12 }13 void show(){14 cout<<a<<endl;15 }16 }; 17 A Func() {18 A test_a(4);19 return test_a;20 }21 int main(){22 Func().show(); 23 24 return 0;25 }[url=][/url]
call copy construct4
4
浅拷贝和深拷贝
[url=][/url]
1 #include<iostream> 2 using namespace std; 3 class A{ 4 public: 5 int a; 6 int *p; 7 A(int value1, int value2){ 8 a = value1; 9 p = new int(value2);10 }11 ~A(){12 delete p;13 }14 15 void show(){16 cout<<a<<endl;17 cout<<p<<endl;18 cout<<*p<<endl;19 }20 };21 22 int main(){23 A test_a(10,20);24 test_a.show();25 26 A test_b(test_a);27 test_b.show();28 29 return 0;30 }[url=][/url]
[url=][/url]
100xf1901020100xf1901020*** glibc detected *** ./a.out: double free or corruption (fasttop): 0x0000000000f19010 ***...[url=][/url]
[url=][/url]
1 #include<iostream> 2 using namespace std; 3 class A{ 4 public: 5 int a; 6 int *p; 7 A(int value1, int value2){ 8 a = value; 9 p = new int(value2);10 }11 A(A& tmp){12 a = tmp.a;13 p = new int(* tmp.p);14 }15 ~A(){16 delete p;17 }18 19 void show(){20 cout<<a<<endl;21 cout<<p<<endl;22 cout<<*p<<endl;23 }24 }; 25 26 int main(){27 A test_a(10,20); 28 test_a.show();29 30 A test_b(test_a);31 test_b.show();32 33 return 0;34 }[url=][/url]
100xd4d01020100xd4d03020