C++類中建構函式
我們在定義一個類之後,在利用該類定義了一個物件後,往往需要對該物件中資料成員變數進行初始化。有時候我們會誤操作,忘記初始化或者重複初始化,這樣做都會造成程式的崩潰。C++給我們提供了一個很有用的方法,就是類的建構函式。
C++類的建構函式,和其它成員函式一樣,在類中定義。不過建構函式和其他成員函式不一樣的是,它沒有返回值,連有void也不行,它的名稱和類名一模一樣,它在物件例項化的時候被自動呼叫且僅被呼叫一次。如果沒有人為定義一個建構函式,編譯器將會自動的載入一個建構函式,它是空的,不進行任何操作,和下面這個例子中我們定義的建構函式一樣:
class teacher {public: teacher(); };
定義了一個teacher類,其中裡面有個建構函式teacher(),它不做任何事情,這是無參的建構函式。
class teacher
{
public:
teacher(){m_strName = "TOM";}
private:
string m_strName;
};
這也是個無參的建構函式,不過它有對屬性m_strName進行操作,進行了初始化值為“TOM”;
class teacher { public: teacher(string name){m_strName = name;} private: string m_strName; };
這是有參的建構函式,它可以讓我們在定義一個teacher類物件的時候,就傳入引數name,例如
teacher t_ch("Tom");
這樣,我們在定義一個物件t_ch 時,就初始化了該物件的m_strName為“TOM”.
還有,類建構函式可以利用初始化列表進行對屬性賦值。利用初始化列表對屬性進行賦值,除了具有以上的作用外,最重要的是,如果該類中定義了一個常量const,則在對這個常量進行初始化的時候,只有利用初始化列表進行賦值初始化。如下圖所示:
上例中,m_iMax為由const定義的全域性常量,我們知道我們是無法在定義之外對全域性常量進行賦值修改,而類中又不允許在定義的時候初始化,那麼,只能通過初始化列表的方式來對全域性常量進行初始化。class teacher { public: teacher(string name, int age, int m):m_strName(name),m_iAge(age),m_iMax(m); private: string m_strName; int m_iAge; const int m_iMax; };
另外,建構函式可以有多個,可以進行過載,具體在初始化的時候,選取哪個建構函式,取決於你傳入的引數。關於過載,這裡就不詳細解釋了。
綜上,類的建構函式分為兩大類,第一大類為無參的建構函式,我們也稱之為系統預設的建構函式;第二大類為有參的建構函式,有參的建構函式又可以分為帶有預設值的有參建構函式和不帶預設值的有參建構函式。
除以上常規的建構函式外,還有一種比較特殊的拷貝建構函式,它是在當你首先例項化程式中第一個物件後,用例項化的第一個物件來例項化剩下的物件,例如
int main()
{
teacher t_ch;
teacher t_ch2 = t_ch;
teacher t_ch3(t_ch);
return 0;
}
在例項化 t_ch2 和 t_ch3時,就不會呼叫teacher類中定義的建構函式,而會呼叫拷貝建構函式,其格式為 類名(const 類名 &變數名)
class teacher
{
public:
teacher(){m_strName ="Tom";}
teacher(){const teacher &name){}
private:
string m_strName;
};
第二個建構函式即為拷貝建構函式。