類的六個預設成員函式(未完待續)
阿新 • • 發佈:2019-02-10
1. 建構函式
程式中常需要對變數賦初值進行初始化,這在基於過程的程式中是很容易的,在定義變數時賦以初值,比如: int a = 10;
而在基於物件的設計中,在定義一個物件時,也需要做初始化的工作,即對成員變數賦初值進行初始化。物件代表一個實體,每一個物件都有它確定的屬性(成員變數),在系統為物件分配記憶體時,應該對有關的資料成員初始化。
-如果一個類的所有成員變數都是公有的,則可以在定義物件時對成員變數直接進行初始化,比如:
class Time
{
public:
int _hour;
int _minute;
int _sec;
};
Time t={12 ,0,0};//定義物件時直接進行初始化
-如果成員變數是私有的,或者類中有private或protected的成員變數,則不能用上述方法,這就用到了建構函式。
C++提供了一個公有成員函式-建構函式來處理物件的初始化。建構函式與其它公有函式不同,不需要使用者呼叫它,僅在定義物件時自動執行一次。建構函式的特點有以下幾個方面:
- 函式名必須與類名相同
- 建構函式無返回值
- 物件構造時(物件例項化)時自動呼叫建構函式
- 建構函式可以過載
- 建構函式可以在類內定義,也可以在類外定義(類外定義需加::)
- 建構函式無隱含的this形參
- 如果使用者沒有定義建構函式,則編譯器會自動生成一個無參的建構函式
- 無參的建構函式和全預設值的建構函式都認為是預設建構函式,並且預設的建構函式只能有一個
- 建構函式寫成全預設的方式最好
class Time
{
private:
int _hour;
int _minute;
int _sec;
public:
Time();//無參的建構函式
Time(int hour=12,int minute=0,int sec=0);//全預設的建構函式,採用類外定義方式
};
Time::Time(int hour=12,int minute=0,int sec=0)
{
_hour=hour;
_minute=minute;
_sec=sec;
}
void TestTime()
{
Time t1;//呼叫無參的建構函式
Time t2(24,0,0);//呼叫全預設的建構函式
}
2. 拷貝建構函式
-拷貝建構函式是一種特殊的建構函式,它在建立物件時,是使用同一類中之前建立的物件來初始化新建立的物件。那麼什麼時候拷貝建構函式會被呼叫呢,有以下情況:
-物件以值傳遞的方式傳入函式體
-物件以值傳遞的方式從函式返回
-物件需要通過另一個物件進行初始化
拷貝建構函式的特點有以下幾個方面:
- 拷貝建構函式其實是一個建構函式的過載
- 拷貝建構函式的引數必須是引用傳參
- 如果使用者沒有定義拷貝建構函式,系統會預設生成一個預設的拷貝建構函式。預設的拷貝建構函式會,依次拷貝類成員進行初始化。
class Time
{
private:
int _hour;
int _minute;
int _sec;
public:
Time();
Time(Time& t); //拷貝建構函式
{
_hour=t->_hour;
_minute=t->_minute;
_sec=t->_sec;
}
};
void Test()
{
Time t1;//呼叫建構函式
Time t2(t1);//用t1初始化t2,呼叫拷貝建構函式
}
3. 解構函式
解構函式與建構函式相反,當物件結束其生命週期時(例如物件所在的函式已呼叫完畢),系統會自動執行解構函式。解構函式往往用來做“清理善後” 的工作(例如在建立物件時用new開闢了一片記憶體空間,delete會自動呼叫解構函式後釋放記憶體)。
解構函式也是特殊的成員函式,特點有:
- 解構函式在類名前加~
- 解構函式無返回值無引數,所以解構函式不能過載
- 一個類有且只有一個解構函式。若未顯示定義,系統會自動生成預設的解構函式。
- 物件的生命週期結束時,編譯器會自動呼叫解構函式
- 解構函式並不是刪除物件,而是“清理善後”,比如new空間的釋放
- 先構造的物件後析構
class Time
{
private:
int _hour;
int _minute;
int _sec;
public:
Time(int, int, int);//全預設建構函式
Time(Time& t);//拷貝建構函式
~Time();//解構函式
};
Time::Time(int hour = 24, int minute = 0, int sec = 0)
{
_hour = hour;
_minute = minute;
_sec = sec;
cout << "呼叫了建構函式" << endl;
}
Time::Time(Time& t)
{
_hour = t._hour;
_minute = t._minute;
_sec = t._sec;
cout << "呼叫了拷貝建構函式" << endl;
}
Time::~Time()
{
cout << "呼叫了解構函式" << endl;
}
int main()
{
{
Time t1;
Time t2(t1);
}
//在物件生命週期結束後,編譯器會自動呼叫解構函式,先構造的後析構,所以花括號內是物件的生命週期。
}