1. 程式人生 > >物件生存週期

物件生存週期

建構函式:初始化物件的時候自動呼叫成員方法

  •  如果不自己實現,編譯器會預設生成一個預設建構函式
  •  如果自己實現,則編譯器不會生成
  •  建構函式可以過載

拷貝構造:用一個已經存在的物件,構造同類型的新物件

  •  防止淺拷貝
  •  如果不自己實現,預設生成一個淺拷貝的拷貝構造
  •  拷貝建構函式必須傳引用(防止遞迴拷貝構造)

過載= :用一個已經存在的物件給另一個已經存在的物件賦值

  •  如果不自己實現,編譯器會預設生成一個淺拷貝的=
  •  防止自賦值
  •  防止記憶體洩漏
  •  防止淺拷貝

解構函式:一個物件生存週期滿,自動呼叫的成員方法

  • 不可以過載,沒有引數
  • 如果不自己實現,編譯器會預設生成
  • 防止記憶體洩漏

臨時物件

  • 臨時物件的生存週期只在本語句
  • 臨時物件如果被引用,它的生存週期就和引用相同

假設有一個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;
}
  • 顯示物件:出現型別名
  • 隱式物件:不出現型別名
  • 內建型別的臨時物件是常量
  • 不允許洩漏常量的引用或指標給非常量的引用或指標
  • 自定義型別產生的臨時物件:隱式:常量        顯示:非常量