拷貝構造函式呼叫時機
class stud ;
stud stu1 = ;
1 使用乙個物件初始化另乙個物件
stud stu2 = stu1 ;
2 stu stu2 (stu1) ;
3 物件作為實參傳給函式形參
printf_stu(const stud st )
prittf_stu( stu1 ) ;
4 函式的返回值是乙個物件
拷貝建構函式形式:
stud ( const stud & st ) 其中const是可選項
匿名物件
stud g()
返回乙個匿名物件:用s1建立了乙個匿名物件,此時會呼叫拷貝建構函式
void p()
此函式呼叫時,會執行一次析構函式,釋放s1所佔空間,函式呼叫完成後,再呼叫析構函式釋放匿名物件所佔空間。
若 用 stud stu2 = g() ; 則此語句後,匿名物件被扶正,(編譯器已經優化,不會呼叫拷貝建構函式)即變成stu2,不會被析構。
若 stud stu2 ; stu2 = ; stu2 = g() ; 【此處會呼叫物件的賦值運算】然後匿名物件變無用,同樣會呼叫析構函式釋放匿名物件所佔空間
stud(1 ,2,3) ; 將呼叫建構函式,生成匿名物件,該匿名的生命週期僅為該語句,即先呼叫玩建構函式即刻
請注意物件的賦值與初始化的區別
預設的拷貝建構函式是淺拷貝
深拷貝建構函式: // 拷貝時,記憶體空間重新分配,然後再指向相同的值,即為深拷貝。
stud (const stud & stu1 )
物件使用預設的賦值操作符也是淺複製。 如果類成員中包含指標變數,則同樣會出現淺複製所出現的問題。解決辦法就是對自己對複製操作符進行過載。 operator =() ;
建構函式初始化列表 解決: 在乙個類b中,有成員變數(類a物件),(其中類a設計了建構函式)
根據建構函式的呼叫規則,設計a的建構函式必須要使用,否則沒有機會初始化a ,如果包含多個類,則在呼叫子類的建構函式時是按照類成員的定義順序呼叫,不是按照初始化列表來呼叫。析構呼叫順序與構造順序相反。
classname() : a(1) , b(2)
列表初始化還用來給類的const成員變數初始化
在建構函式中呼叫建構函式如果沒有物件來接收所呼叫的建構函式生成的匿名物件,將會直接將匿名物件析構。 即建構函式裡所呼叫建構函式沒有任何作用
C 複製建構函式,過載賦值運算子
c 的複製建構函式,賦值建構函式,有時候會有點暈,下面總結一下 首先來談一下複製建構函式 includeusing namespace std include includeclass a void fuction void show int main 解釋 定義了乙個類,資料成員有字元指標,和整型...
C 複製建構函式和賦值運算子過載函式
宣告乙個空的類testsize,sizeof testsize 為1,為其宣告建構函式和析構函式,依舊為1 建構函式不能使用關鍵字virtual,析構函式可以 一旦類中存在虛函式,就會為該類生成虛函式表,並在每乙個例項中新增乙個指向虛函式表的指標,從而大小為乙個指標大小,32位機器上為4,64位機器...
複製建構函式和賦值運算子
進行c 類設計時,如果不對複製建構函式和賦值運算子進行重寫的話,編譯器會預設呼叫預設函式。預設的複製建構函式和賦值運算子會造成許多問題。先看下面一段 include include class my string int my string num string 0 my string my str...