每個類只有乙個賦值函式.
1.如果不主動編寫拷貝建構函式和賦值函式,編譯器將以「位拷貝」的方式自動生成預設的函式。倘若類中含有指標變數,那麼這兩個預設的函式就隱含了錯誤。以類string的兩個物件a,b為例,假設a.m_data的內容為「hello」,b.m_data的內容為「world」。
現將a賦給b,預設賦值函式的「位拷貝」意味著執行b.m_data = a.m_data。這將造成三個錯誤:一是b.m_data原有的記憶體沒被釋放,造成記憶體洩露;二是b.m_data和a.m_data指向同一塊記憶體,a或b任何一方變動都會影響另一方;三是在物件被析構時,m_data被釋放了兩次。
2.拷貝建構函式和賦值函式非常容易混淆,常導致錯寫、錯用。拷貝建構函式是在物件被建立時呼叫的,而賦值函式只能被已經存在了的物件呼叫。以下程式中,第三個語句和第四個語句很相似,你分得清楚哪個呼叫了拷貝建構函式,哪個呼叫了賦值函式嗎?
string a(「hello」);
string b(「world」);
string c = a; // 呼叫了拷貝建構函式,最好寫成 c(a);
c = b; // 呼叫了賦值函式
本例中第三個語句的風格較差,宜改寫成string c(a) 以區別於第四個語句。
拷貝建構函式和賦值構造
為什麼空類可以建立物件呢?複製建構函式的引數可以是 const 引用,也可以是非 const 引用。一般使用前者,這樣既能以常量物件 初始化後值不能改變的物件 作為引數,也能以非常量物件作為引數去初始化其他物件。乙個類中寫兩個複製建構函式,乙個的引數是 const 引用,另乙個的引數是非 const...
拷貝建構函式和賦值建構函式
class cmystring 賦值建構函式 cmystring cmystring operator const cmystring str 新分配記憶體,將str的m pdata記憶體拷貝到m pdata中 m pdata new char strlen str.m pdata 1 strcpy...
拷貝建構函式和賦值建構函式
拷貝構造是確確實實構造乙個新的物件,並給新物件的私有成員賦上引數物件的私有成員的值,新構造的物件和引數物件位址是不一樣的,所以如果該類中有乙個私有成員是指向堆中某一塊記憶體,如果僅僅對該私有成員進行淺拷貝,那麼會出現多個指標指向堆中同一塊記憶體,這是會出現問題,如果那塊記憶體被釋放了,就會出現其他指...