1. 程式人生 > 其它 >簡述:物件的初始化和清理

簡述:物件的初始化和清理

建構函式和解構函式

物件的初始化和清理是兩個非常重要的安全問題

一個物件或者變數沒有初始狀態,對其使用後果是未知

同樣的使用完一個物件或變數,沒有及時清理,也會造成一定的安全問題

c++利用了建構函式解構函式解決上述問題,這兩個函式將會被編譯器自動呼叫,完成物件初始化和清理工作。

物件的初始化和清理工作是編譯器強制要我們做的事情,因此如果我們不提供構造和析構,編譯器會提供

編譯器提供的建構函式和解構函式是空實現。

  • 建構函式:主要作用在於建立物件時為物件的成員屬性賦值,建構函式由編譯器自動呼叫,無須手動呼叫。

  • 解構函式:主要作用在於物件銷燬前系統自動呼叫,執行一些清理工作。

建構函式語法:

  類名(){}

  1. 建構函式,沒有返回值也不寫void

  2. 函式名稱與類名相同

  3. 建構函式可以有引數,因此可以發生過載

  4. 程式在呼叫物件時候會自動呼叫構造,無須手動呼叫,而且只會呼叫一次

解構函式語法:

  ~類名(){}

  1. 解構函式,沒有返回值也不寫void

  2. 函式名稱與類名相同,在名稱前加上符號 ~

  3. 解構函式不可以有引數,因此不可以發生過載

  4. 程式在物件銷燬前會自動呼叫析構,無須手動呼叫,而且只會呼叫一次

建構函式的分類及呼叫

兩種分類方式:

  •   按引數分為: 有參構造和無參構造
  •   按型別分為: 普通構造和拷貝構造

三種呼叫方式:

  •   括號法
  •   顯示法
  •   隱式轉換法
    //  括號法,常用
    Person p1(10);
    //注意1:呼叫無參建構函式不能加括號,如果加了編譯器認為這是一個函式宣告
    //Person p2();

    // 顯式法
    Person p2 = Person(10); 
    Person p3 = Person(p2);
    //Person(10)單獨寫就是匿名物件  當前行結束之後,馬上析構

    //隱式轉換法
    Person p4 = 10; // Person p4 = Person(10); 
    Person p5 = p4; // Person p5 = Person(p4); 

    
//注意2:不能利用 拷貝建構函式 初始化匿名物件 編譯器認為是物件宣告 //Person p5(p4);

拷貝建構函式呼叫時機

C++中拷貝建構函式呼叫時機通常有三種情況

  • 使用一個已經建立完畢的物件來初始化一個新物件

  • 值傳遞的方式給函式引數傳值

  • 以值方式返回區域性物件

    Person man(100); //p物件已經建立完畢
    Person newman(man); //呼叫拷貝建構函式
    Person newman2 = man; //拷貝構造

    //Person newman3;
    //newman3 = man; //不是呼叫拷貝建構函式,賦值操作

建構函式呼叫規則

預設情況下,c++編譯器至少給一個類新增3個函式

1.預設建構函式(無參,函式體為空)

2.預設解構函式(無參,函式體為空)

3.預設拷貝建構函式,對屬性進行值拷貝

建構函式呼叫規則如下:

  • 如果使用者定義有參建構函式,c++不在提供預設無參構造,但是會提供預設拷貝構造

  • 如果使用者定義拷貝建構函式,c++不會再提供其他建構函式