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;

      }

程序運行截圖
在這裏插入圖片描述

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;

      }

在這裏插入圖片描述
以上三種情況是比較常見的複製構造函數被調用的例子

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章