物件的初始化和清理是非常重要的安全問題
建構函式:建立物件時為物件的成員屬性賦值,建構函式由編譯器自動呼叫,無需手動呼叫
析構函式:物件銷毀前自動呼叫,執行一些清理工作
當我們不提供構造和析構時,編譯器會提供,而編譯器提供的時空實現的
建構函式語法:類名(){}
無返回值也不寫void
函式名稱與類名相同
可以有引數,因此可以發生過載
程式再呼叫物件時候會自動呼叫,無須手動呼叫,而且僅會呼叫一次
析構函式語法:~類名(){}
無返回值也不寫void
函式名稱與類名相同,在前面加上~
不可以有引數,因此不可以發生過載
物件銷毀前自動呼叫析構,無需手動呼叫,且僅呼叫一次
#include
using
namespace std;
class
person
~person()
};void
test01()
//為區域性變數,函式呼叫後被立刻釋放,因此析構和建構函式都會被呼叫
intmain()
#include
using
namespace std;
class
person
person
(int a)
person
(const person& p)
~person()
//析構函式};
void
test01()
void
test02()
intmain()
c++中拷貝構造函式呼叫的時機通常有三種情況
#include
using
namespace std;
class
person
person
(int age)
person
(const person &p)
int age;
~person()
};//1.使用乙個已經建立完畢的物件來初始化乙個新的物件
void
test01()
//2.值傳遞的方式給函式引數傳值
void
dowork
(person p)
void
test02()
//3.值方式返回區域性物件
person dowork2()
void
test03()
intmain()
預設情況下,c++編譯器至少給乙個類新增3個函式
預設建構函式無參(函式體為空)
預設析構函式無參 (函式體為空)
預設拷貝建構函式,對屬性進行值拷貝
構造函式呼叫規則如下:
#include
using
namespace std;
class
person
person
(int age)
person
(const person &p)
int m_age;
~person()
};void
test01()
void
test02()
intmain()
淺拷貝:簡單的賦值拷貝
深拷貝:在堆區重新申請空間,進行拷貝操作
#include
using
namespace std;
class
person
person
(int age,
int height)
person
(const person &p)
int m_age;
int*m_height;
~person()
//此時會出錯,因為此時p1和p2的身高所指向的空間是同乙個空間,而當p2的析構函式釋放該處的記憶體後(先進後出p2先被釋放),p1的析構函式會再次釋放此記憶體,因此會出錯
//解決此問題應當自己寫拷貝函式,使得兩個函式指向的空間不同
cout <<
"person析構構造函式呼叫"
<;void
test01()
intmain()
C 學習之建構函式 析構函式
在c 的類中,都會有乙個或多個建構函式 乙個析構函式 乙個賦值運算操作符。即使我們自己定義的類中,沒有顯示定義它們,編譯器也會宣告乙個預設建構函式 乙個析構函式和乙個賦值運算操作符。例如 宣告乙個空類 class empty 但是這個空類和下面這個類是等同的 class empty 預設建構函式 e...
C 之建構函式和析構函式
我們已經知道了物件就是類的例項,二者的關係就相當於資料型別與它的變數的關係。每個物件區別於其他物件的地方就是依靠它的自身屬性,即資料成員的值。c 中,物件在定義的時候進行的資料成員的設定,稱為物件的初始化。同樣,在特定物件使用結束時,還要對資料成員進行一些清理工作。c 中對類的初始化和清理的工作,分...
C 之建構函式和析構函式
一 建構函式 1 物件的初始化和建構函式 類是一種抽象的資料型別,它不占用儲存空間,不能容納具體的資料。因此在類宣告中不能給資料成員賦初值。例如 錯誤 class complex 與使用變數一樣,使用物件時也應該先定義,後使用。在定義物件時,對資料成員賦初值,稱為初始化。例如 class compl...