物件的初始化和清理
阿新 • • 發佈:2022-03-25
物件的初始化和清理
- 生活中我們買的電子產品都基本會有出廠設定,在某一天我們不用時候也會刪除一些自己資訊資料保證安全
- C++中的面向物件來源於生活,每個物件也都會有初始設定以及 物件銷燬前的清理資料的設定。
1 建構函式和解構函式
物件的初始化和清理也是兩個非常重要的安全問題
一個物件或者變數沒有初始狀態,對其使用後果是未知
同樣的使用完一個物件或變數,沒有及時清理,也會造成一定的安全問題
c++利用了建構函式和解構函式解決上述問題,這兩個函式將會被編譯器自動呼叫,完成物件初始化和清理工作。
物件的初始化和清理工作是編譯器強制要我們做的事情,因此如果我們不提供構造和析構,編譯器會提供
編譯器提供的建構函式和解構函式是空實現。
- 建構函式:主要作用在於建立物件時為物件的成員屬性賦值,建構函式由編譯器自動呼叫,無須手動呼叫。
- 解構函式:主要作用在於物件銷燬前系統自動呼叫,執行一些清理工作。
建構函式語法:類名(){}
- 建構函式,沒有返回值也不寫void
- 函式名稱與類名相同
- 建構函式可以有引數,因此可以發生過載
- 程式在呼叫物件時候會自動呼叫構造,無須手動呼叫,而且只會呼叫一次
解構函式語法: ~類名(){}
- 解構函式,沒有返回值也不寫void
- 函式名稱與類名相同,在名稱前加上符號 ~
- 解構函式不可以有引數,因此不可以發生過載
- 程式在物件銷燬前會自動呼叫析構,無須手動呼叫,而且只會呼叫一次
class Person { public: //建構函式 Person() { cout << "Person的建構函式呼叫" << endl; } //解構函式 ~Person() { cout << "Person的解構函式呼叫" << endl; } }; void test01() {
//棧上的資料,函式執行完自動釋放,如果是Person p=new Person()形式的話就是堆上的資料了。 Person p; } intmain() { 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; }