1. 程式人生 > >類的六個預設成員函式(未完待續)

類的六個預設成員函式(未完待續)

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);
    }
    //在物件生命週期結束後,編譯器會自動呼叫解構函式,先構造的後析構,所以花括號內是物件的生命週期。
}

這裡寫圖片描述