簡述:物件的初始化和清理
阿新 • • 發佈:2021-06-24
一個物件或者變數沒有初始狀態,對其使用後果是未知
同樣的使用完一個物件或變數,沒有及時清理,也會造成一定的安全問題
c++利用了建構函式和解構函式解決上述問題,這兩個函式將會被編譯器自動呼叫,完成物件初始化和清理工作。
物件的初始化和清理工作是編譯器強制要我們做的事情,因此如果我們不提供構造和析構,編譯器會提供。
編譯器提供的建構函式和解構函式是空實現。
-
建構函式:主要作用在於建立物件時為物件的成員屬性賦值,建構函式由編譯器自動呼叫,無須手動呼叫。
-
解構函式:主要作用在於物件銷燬前
-
建構函式,沒有返回值也不寫void
-
函式名稱與類名相同
-
建構函式可以有引數,因此可以發生過載
-
程式在呼叫物件時候會自動呼叫構造,無須手動呼叫,而且只會呼叫一次
-
解構函式,沒有返回值也不寫void
-
函式名稱與類名相同,在名稱前加上符號 ~
-
解構函式不可以有引數,因此不可以發生過載
-
程式在物件銷燬前會自動呼叫析構,無須手動呼叫,而且只會呼叫一次
兩種分類方式:
- 按引數分為: 有參構造和無參構造
- 按型別分為: 普通構造和拷貝構造
三種呼叫方式:
- 括號法
- 顯示法
- 隱式轉換法
// 括號法,常用 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; //不是呼叫拷貝建構函式,賦值操作
1.預設建構函式(無參,函式體為空)
2.預設解構函式(無參,函式體為空)
3.預設拷貝建構函式,對屬性進行值拷貝
建構函式呼叫規則如下:
-
如果使用者定義有參建構函式,c++不在提供預設無參構造,但是會提供預設拷貝構造