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

物件的初始化和清理

物件的初始化和清理

  • 生活中我們買的電子產品都基本會有出廠設定,在某一天我們不用時候也會刪除一些自己資訊資料保證安全
  • C++中的面向物件來源於生活,每個物件也都會有初始設定以及 物件銷燬前的清理資料的設定。

1 建構函式和解構函式

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

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

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

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

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

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

  • 建構函式:主要作用在於建立物件時為物件的成員屬性賦值,建構函式由編譯器自動呼叫,無須手動呼叫。
  • 解構函式:主要作用在於物件銷燬前系統自動呼叫,執行一些清理工作。

建構函式語法:類名(){}

  1. 建構函式,沒有返回值也不寫void
  2. 函式名稱與類名相同
  3. 建構函式可以有引數,因此可以發生過載
  4. 程式在呼叫物件時候會自動呼叫構造,無須手動呼叫,而且只會呼叫一次

解構函式語法: ~類名(){}

  1. 解構函式,沒有返回值也不寫void
  2. 函式名稱與類名相同,在名稱前加上符號 ~
  3. 解構函式不可以有引數,因此不可以發生過載
  4. 程式在物件銷燬前會自動呼叫析構,無須手動呼叫,而且只會呼叫一次

 

class Person
{
public:
    //建構函式
    Person()
    {
        cout << "Person的建構函式呼叫" << endl;
    }
    //解構函式
    ~Person()
    {
        cout << "Person的解構函式呼叫" << endl;
    }

};

void test01()
{
//棧上的資料,函式執行完自動釋放,如果是Person p=new Person()形式的話就是堆上的資料了。 Person p; }
int
main() { test01(); system("pause"); return 0; }

 

 

 

2 建構函式的分類及呼叫

兩種分類方式:

​ 按引數分為: 有參構造和無參構造

​ 按型別分為: 普通構造和拷貝構造

三種呼叫方式:

​ 括號法

​ 顯示法

​ 隱式轉換法

示例:

 

 

//1、建構函式分類
// 按照引數分類分為 有參和無參構造   無參又稱為預設建構函式
// 按照型別分類分為 普通構造和拷貝構造

class Person {
public:
    //無參(預設)建構函式
    Person() {
        cout << "無參建構函式!" << endl;
    }
    //有參建構函式
    Person(int a) {
        age = a;
        cout << "有參建構函式!" << endl;
    }
    //拷貝建構函式
    Person(const Person& p) {
        age = p.age;
        cout << "拷貝建構函式!" << endl;
    }
    //解構函式
    ~Person() {
        cout << "解構函式!" << endl;
    }
public:
    int age;
};

//2、建構函式的呼叫
//呼叫無參建構函式
void test01() {
    Person p; //呼叫無參建構函式
}

//呼叫有參的建構函式
void test02() {

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

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

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

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

int main() {

    test01();
    //test02();

    system("pause");

    return 0;
}