C++中復制構造函數被調用的三種情況


C++中的構造函數

c++中的構造函數分為構造函數,和復制構造函數,相比於構造函數,復制構造函數使用更加方便,快捷。構造函數可以有多個,二復制構造函數只能有一個,因為復制構造函數的參數
只能是當前類的一個對象,參數表是固定的,無法重載,若用戶沒有定義自己的輔助構造函數,系統會自動生成一個復制構造函數,其作用是將參數的之賦予當前的對象.若用戶自己定義了復制構造函數,系統則不會生成默認復制構造函數。用戶自己定義的復制構造函數功能可以自己構造,不一定執行復制的功能。

復制構造函數同構造函數的功能大體相同·,卻又有不同之處,下面介紹復制構造函數在3中情況下的調用
1.當用一個對象去初始化同類的另一個對象時,會引發復制構造函數的調用

以下兩條語句都會導致復制構造函數的調用

     Complex c1(c2);
     Complex c1=c2;

這兩條語句時等價的,其中第二句是初始化語句,不是賦值語句

下面這一條語句不會調用復制構造函數

     Complex c1,c2;
     c1=c2;

2.作為形參的對象,使用復制構造函數初始化的 以下語句可以證明 ```
#include<iostream>
using namespace std;
class A{
 public:
    A(){};//構造函數
     A(A&a)//復制構造函數
    {
        cout<<"Copy constructer called"<<endl;
    }
  };
  void Func(A a)//普通函數
 {

 }
 int main()
  {
  A b;
  Func(b);//此語句相當於是將b復制給Func(a)中的a,導致調用復制構造函數
  retur 0;

  }
程序運行截圖
![](https://img2018.cnblogs.com/blog/1787128/201909/1787128-20190923130715086-1371240220.png)


3.如果函數返回的是類A的對象,那么函數返回時,類A的復制構造函數會被調用
程序如下
```
     #include<iostream>
     using namespace std;

     class A{
     public:
       int v;
       A(int i){
           v=i;
        };//構造函數
        A(A&a)//復制構造函數
        {
            cout<<"Copy constructer called"<<endl;
         }
      };
       A a(4);
       A Func()//普通函數
       {

          return a;
       }
        int main()
        {
        cout<<Func().v<<endl;//此語句中的Func()是一個類A的對象,但是不是a,只是用a初始化。
        return 0;

      }
```
![](https://img2018.cnblogs.com/blog/1787128/201909/1787128-20190923131944479-314999831.png)


##
以上三種情況是比較常見的復制構造函數被調用的例子

歡迎討論,斧正


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM