物件生存週期
阿新 • • 發佈:2018-11-25
建構函式:初始化物件的時候自動呼叫成員方法
- 如果不自己實現,編譯器會預設生成一個預設建構函式
- 如果自己實現,則編譯器不會生成
- 建構函式可以過載
拷貝構造:用一個已經存在的物件,構造同類型的新物件
- 防止淺拷貝
- 如果不自己實現,預設生成一個淺拷貝的拷貝構造
- 拷貝建構函式必須傳引用(防止遞迴拷貝構造)
過載= :用一個已經存在的物件給另一個已經存在的物件賦值
- 如果不自己實現,編譯器會預設生成一個淺拷貝的=
- 防止自賦值
- 防止記憶體洩漏
- 防止淺拷貝
解構函式:一個物件生存週期滿,自動呼叫的成員方法
- 不可以過載,沒有引數
- 如果不自己實現,編譯器會預設生成
- 防止記憶體洩漏
臨時物件
- 臨時物件的生存週期只在本語句
- 臨時物件如果被引用,它的生存週期就和引用相同
假設有一個CGoods類
1、CGoods s1 = "huotui"; /* (1)用"huotui"構造一個臨時物件 (2)用該臨時物件拷貝構造s1 (3)析構該臨時物件 以上三步可以優化為:用"huotui"直接構造s1 */ 2、s1 = "rou"; /* (1)用"rou"構造一個臨時物件 (2)用該臨時物件給s1賦值 (3)析構該臨時物件 不可以優化 */ 3、CGoos &s2 = (CGoods)"fangbianmian" /* (1)用"fangbianmian"構造一個臨時物件 (2)將該臨時物件的引用給s2; */
CGoods fun(const CGoods good) { CGoods good1 = good; return good1; } int main() { CGoods s1 = "huotui"//構造s1 fun(s1); /* (1)拷貝構造引數 (2)用引數拷貝構造good1 (3)用good1在主函式棧幀中拷貝構造一個臨時物件 (4)fun函式析構good1 (5)fun函式析構引數goods (6)fun函式棧幀回退完成,主函式先析構臨時物件 (7)主函式析構s1 */ return 0; }
- 顯示物件:出現型別名
- 隱式物件:不出現型別名
- 內建型別的臨時物件是常量
- 不允許洩漏常量的引用或指標給非常量的引用或指標
- 自定義型別產生的臨時物件:隱式:常量 顯示:非常量