c 拷貝建構函式與深轉殖淺轉殖的關係

2021-10-24 01:40:54 字數 1612 閱讀 1306

當你自定義乙個類,如果不去宣告函式,編譯器就會為它預設宣告乙個建構函式、拷貝建構函式、賦值運算子和析構函式。

如果使用編譯器給你建立的拷貝建構函式和賦值運算子操作類物件時,會把這個類的所有資料成員都進行一次賦值操作。

class

cstudent

cstudent

(int nid,

int nage)

:m_nid

(nid)

,m_nage

(nage)

void

show()

const

private

:int m_nid;

int m_nage;};

intmain()

當然你也可以自己重寫拷貝建構函式,注意寫的時候不要遺漏某個成員變數,不然就會出錯哦。

//拷貝建構函式

cstudent

(const cstudent& obj)

注意:

語句「cstudent obj2;

obj2 = obj1;「

和語句「cstudent obj2 = obj1;」

在呼叫函式上是有區別的:前者第一句是物件obj2的宣告及定義,呼叫類classa的無參建構函式,所以「obj2 = obj1;」一句是在物件obj2已經存在的情況下,用obj1來為obj2賦值,呼叫的是賦值運算子過載函式;而後者,是用obj1來初始化obj2,呼叫的是拷貝建構函式。

說到淺轉殖,其實就是呼叫類的拷貝建構函式。一般你自定義乙個類,不去重寫它的拷貝建構函式的話,它進行的就是淺轉殖。將目標物件成員變數的值賦值給本物件。如果這個類的成員變數沒有指標成員變數的話,是沒問題的,如果有,最後會出現記憶體被多次釋放的問題。

因為編譯器預設的賦值運算就是成員變數之間進行賦值,如果這個成員變數是指標,也會進行賦值操作。這樣的話,兩個物件的成員指標變數指向相同的記憶體位址,當他們各自釋放時,這塊記憶體就會被釋放兩次。

當這個類存在指標的成員變數時,就需要我們去重寫拷貝建構函式和賦值運算子,對指標成員變數new一塊空間進行賦值。

class

cstudent

cstudent

(int nid,

int nage,

const

char

* pstrname)

:m_nid

(nid)

,m_nage

(nage)

,m_pstrname

(nullptr

)//拷貝建構函式

cstudent

(const cstudent& obj)

//賦值運算子(類內過載)

cstudent&

operator=(

const cstudent& obj)

void

show()

const

private

:int m_nid;

int m_nage;

std::string* m_pstrname;};

intmain()

C 淺轉殖與深轉殖(淺拷貝與深拷貝)

介紹 1 淺轉殖 在淺轉殖中,如果原型物件的成員變數是值型別,將複製乙份給轉殖物件 如果原型物件的成員變數是引用型別,則將引用物件的位址複製乙份給轉殖物件,也就是說原型物件和轉殖物件的成員變數指向相同的記憶體位址。簡單來說,在淺轉殖中,當物件被複製時只複製它本身和其中包含的值型別的成員變數,而引用型...

c 深轉殖與淺轉殖

我們都知道memberwiseclone 會將淺轉殖。什麼是淺轉殖?如何深轉殖呢?public class good private static good good private static good good new good public good createinstance publi...

淺轉殖與深轉殖

clone 方法是object中的乙個方法 淺轉殖 shallow copy employee cindy tobby.clone 深轉殖 deep copy 必須實現cloneable介面 class employee implements cloneable 如果物件中有引用型別,就必須使用深度...