1. 程式人生 > >建構函式 引數初始化列表

建構函式 引數初始化列表

建立類物件時會自動呼叫建構函式

建構函式不需且不能手動呼叫

預設建構函式:在建立物件時不必給出實參的建構函式。包括無參建構函式和全部引數都有預設值的建構函式。

如果使用者沒有定義建構函式,則系統會自動提供一個預設建構函式,即上述的無參建構函式,函式體為空。

引數初始化表的必要性

當給類中的私有常量定義時,必須通過引數初始化列表來定義,因為引數初始化表是先於函式體執行的,而常量不允許修改。

class Circle
{
    public:
        Circle():m_dPi(3.14){}
    private:
        const double
m_dPi; };

下面這種寫法是不被允許

    Circle(){m_dPi=3.14;}

使用預設引數的建構函式

在宣告建構函式時指定預設值,而不能只在定義建構函式時指定預設值。
因為建構函式的宣告在類定義中,而類定義是放在標頭檔案中的,是類的對外介面,而建構函式的定義是類的實現細節,使用者不一定看得到。這一特點在分檔案中尤其明顯。

class Box{
    public:
        Box(int h=10,int w=20,int len =30);   
        //宣告建構函式時指定預設引數
        /*
        宣告建構函式時形參名可以省略(形參名不重要),即寫成
        Box(int =10,int =20,int=30);
        */
private: int height; int weight; int length; }; Box::Box(int h, int w, int len){ //定義建構函式時可以不指定預設引數 height=h; weight=w; length=len; }

拷貝建構函式

定義格式 :類名(const 類名 & 變數名)

注:一般約定加const宣告,避免在呼叫此函式時修改實參物件。

當採用直接初始化或賦值初始化例項化物件時系統會自動呼叫拷貝建構函式。

如果沒有顯性定義的拷貝建構函式則系統會自動生成一個預設的拷貝建構函式。

class Student{
    public:
        Student(){m_strName="Jim";}
        /*
        預設的拷貝建構函式:
        Student(const Student &stu){}
        */
        Student(const Student &stu){m_strName=stu.m_strName}
        //顯性定義的拷貝建構函式
    private:
        string m_strName;
};

int main()
{
    Student stu1;
    Student stu2=stu1;
    Student stu3(stu1);
    return 0;
}