c++拷貝建構函式 && 賦值語句
阿新 • • 發佈:2019-02-01
拷貝建構函式
- 拷貝建構函式的定義:
同一個類的物件在記憶體中有完全相同的結構,如果作為一個整體進行復制或拷貝是完全可行的(以為他們具有同樣的結構)。這個拷貝的過程只需要拷貝資料成員,而函式成員是公用的(只有一份拷貝)。因此,在建立物件時咳以用同類的另一個物件來初始化物件。這時所用的建構函式成為拷貝構造
- 拷貝建構函式的特點:
類名與函式名相同
引數是自身型別的引用(如果用值進行傳遞,會在傳遞引數時因為是物件給物件傳遞,也會再次呼叫拷貝構造,從而形成死迴圈,不停的呼叫拷貝建構函式)
- 系統預設的拷貝建構函式
也稱為預設的按成員語義支援的拷貝建構函式,物件的每個成員被依次拷貝,也稱之為預設的按成員初始化
。按成員做拷貝是通過依次拷貝每個資料成員實現的,而不是對整個類按位拷貝。
#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值