1. 程式人生 > >c++拷貝建構函式 && 賦值語句

c++拷貝建構函式 && 賦值語句

拷貝建構函式

  • 拷貝建構函式的定義:

同一個類的物件在記憶體中有完全相同的結構,如果作為一個整體進行復制或拷貝是完全可行的(以為他們具有同樣的結構)。這個拷貝的過程只需要拷貝資料成員,而函式成員是公用的(只有一份拷貝)。因此,在建立物件時咳以用同類的另一個物件來初始化物件。這時所用的建構函式成為拷貝構造

  • 拷貝建構函式的特點:

類名與函式名相同
引數是自身型別的引用(如果用值進行傳遞,會在傳遞引數時因為是物件給物件傳遞,也會再次呼叫拷貝構造,從而形成死迴圈,不停的呼叫拷貝建構函式)

  • 系統預設的拷貝建構函式

也稱為預設的按成員語義支援的拷貝建構函式,物件的每個成員被依次拷貝,也稱之為預設的按成員初始化

。按成員做拷貝是通過依次拷貝每個資料成員實現的,而不是對整個類按位拷貝。

#include<iostream>
using namespace std;

class Test
{
public:
    Test(int data=0)
    {
        this->data=data;
    }
    Test(const Test &t)   //拷貝構造,加const是為了保護物件t不被修改
    {
        data=t.data;   //成員給成員賦值
    }
private:
    int data;
};

void main()
{
    Test t(8
); Test t1(t); //等價於Test t1=t;用已有物件初始化新物件呼叫拷貝建構函式 }

呼叫建構函式的時機:
1.用已有物件來初始化新物件(必須在新物件定義的同時完成初始化)
2.當函式的形參是類物件時,在呼叫該函式時使用。這時要在記憶體中新建一個區域性物件,並把實參拷貝到新的物件中。
3.當函式的返回值是類物件時,函式執行完成返回著時使用。其仍然會建立一個臨時物件
由於區域性物件在離開建立它的函式時就消亡了,不可能在返回呼叫函式後繼續生存,因此在處理這種情況時,編譯器會在呼叫函式的表示式中建立一個無名的臨時物件,該臨時物件的生存週期只在函式呼叫處的表示式中。所謂return物件,實際上是呼叫拷貝建構函式吧該物件的值拷入臨時物件。如果返回值為變數,處理過程類似,只是不呼叫拷貝建構函式

賦值語句

  • 賦值語句的定義:

物件給物件賦值(此時的兩個物件均為已有物件,即已經被宣告過)

  • 賦值語句的特點:

過載=
返回值為類名的&,(避免出現連=現象:t=t1=t2,若返回值為void,則無法進行連=賦值)
形參為類名的&

#include<iostream>
using namespace std;

class Test
{
public:
    Test(int data=0)
    {
        this->data=data;
    }
    Test(const Test &t)
    {
        data=t.data;
    }
    Test& operator=(const Test &t)//賦值語句
    {
        if(this!=&t)   //判斷是否是自己給自己賦值,必須判斷
            data=t.data;
        return *this;   //*this代表當前物件,this代表當前物件的地址
    }
private:
    int data;
};

void main()
{
    Test t(8);
    Test t1;
    t=t1;  //t與t1均為已有物件,用已有物件給已有物件賦值,呼叫賦值語句
}

實驗程式碼調結果:最終將t1的data的0值賦給了t的data值
這裡寫圖片描述