拷貝建構式的呼叫時機通常有三種
- 使用一個已經創建完成的物件來初始化一個新物件
- 以值傳遞的方式給函式的引數傳值
- 以值的方式回傳區域物件
下方所有文本均以此代碼為基礎
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 <iostream> 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
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/494126.html
標籤:C++
