4.2.1 建構函式和析構函式
物件的初始化和清理也是兩個非常重要的安全問題
乙個物件或者變數沒有初始狀態,對其使用後果是未知
同樣的使用完乙個物件或變數,沒有及時清理,也會造成一定的安全問題
c++利用了建構函式和析構函式解決上述問題,這兩個函式將會被編譯器自動呼叫,完成物件初始化和清理工作。
物件的初始化和清理工作是編譯器強制要我們做的事情,因此如果我們不提供構造和析構,編譯器會提供
編譯器提供的建構函式和析構函式是空實現。
建構函式語法:類名(){}
建構函式,沒有返回值也不寫void
函式名稱與類名相同
建構函式可以有引數,因此可以發生過載
程式在呼叫物件時候會自動呼叫構造,無須手動呼叫,而且只會呼叫一次
析構函式語法:~類名(){}
析構函式,沒有返回值也不寫void
函式名稱與類名相同,在名稱前加上符號 ~
析構函式不可以有引數,因此不可以發生過載
程式在物件銷毀前會自動呼叫析構,無須手動呼叫,而且只會呼叫一次
class
person
//析構函式
~person()
};void
test01()
intmain()
執行結果:
4.2.2 建構函式的分類及呼叫
兩種分類方式:
按引數分為: 有參構造和無參構造
按型別分為: 普通構造和拷貝構造
三種呼叫方式:
括號法
顯示法
隱式轉換法
示例:
//1、建構函式分類
// 按照引數分類分為 有參和無參構造 無參又稱為預設建構函式
// 按照型別分類分為 普通構造和拷貝構造
class
person
//有參建構函式
person
(int a)
//拷貝建構函式
person
(const person& p)
//析構函式
~person()
public
:int age;};
//2、建構函式的呼叫
//呼叫無參建構函式
void
test01()
//呼叫有參的建構函式
void
test02()
intmain()
執行結果:
4.2.3 拷貝構造函式呼叫時機
c++中拷貝構造函式呼叫時機通常有三種情況
示例:
class
person
person
(int age)
person
(const person& p)
//析構函式在釋放記憶體之前呼叫
~person()
public
:int mage;};
//1. 使用乙個已經建立完畢的物件來初始化乙個新物件
void
test01()
//2. 值傳遞的方式給函式引數傳值
//相當於person p1 = p;
void
dowork
(person p1)
void
test02()
//3. 以值方式返回區域性物件
person dowork2()
void
test03()
intmain()
執行結果:
4.2.4 構造函式呼叫規則
預設情況下,c++編譯器至少給乙個類新增3個函式
1.預設建構函式(無參,函式體為空)
2.預設析構函式(無參,函式體為空)
3.預設拷貝建構函式,對屬性進行值拷貝
構造函式呼叫規則如下:
示例:
class
person
//有參建構函式
person
(int a)
//拷貝建構函式
person
(const person& p)
//析構函式
C 物件的初始化和清理
物件的初始化和清理也是兩個非常重要的安全問題 乙個物件或者變數沒有初始狀態,對其使用後果是未知 同樣的使用完乙個物件或變數,沒有及時清理,也會造成一定的安全問題 c 利用了建構函式和析構函式解決上述問題,這兩個函式將會被編譯器自動呼叫,完成物件初始化和清理工作。物件的初始化和清理工作是編譯器強制要我...
物件的初始化和清理
建構函式和析構函式 構造 初始化 析構 清理 建構函式的語法 類名 析構函式語法 類名 1.建構函式沒有返回值也不寫void 1.建構函式沒有返回值也不寫void 2.函式名稱與類名相同 2.函式名稱與類名相同,在名稱前加 3.建構函式可以有引數,也可以過載 3.建構函式不可以有引數,不可以過載 4...
C 類和物件 物件的初始化和清理
4.2.1 建構函式和析構函式 物件的初始化和清理也是兩個非常重要的安全問題 乙個物件或者變數沒有初始狀態,對其使用後果是未知 同樣的使用完乙個物件或變數,沒有及時清理,也會造成一定的安全問題 c 利用了建構函式和析構函式解決上述問題,這兩個函式將會被編譯器自動呼叫,完成物件初始化和清理工作。物件的...