在C++中,有一種特殊的成員函數,他的名字和類相同,沒有返回值,不需要用戶顯示調用,用戶也無法調用,而是在創建對象的時候自動執行。
這種特殊的函數就是構造函數 Constructor
構造函數的名字與類相同,所以構造函數與類相依而生。以Color類作為例子:
class Color //Color是類的名稱,首字母大寫 { //括號里面是成員變量和成員函數,統稱為類的成員Member public: Color(); //聲明無參構造函數 ~Color(); // 析構函數 Color(int r, int g, int b); // 聲明有參構造函數 void set_color(char r, char g, char b);//成員函數 void display(); //void set_color_hsb(char h, char s, char b); int color_16(); private: int m_red; //類的成員變量一般在前面加 m_//只是變成習慣 int m_green; int m_blue; int m_my_color; };//后面需要一個;
一個類必須有構造函數,要么用戶自己定義,要么編譯器自動生成;
如果用戶自己沒有定義構造函數,那么編譯器會自動生成一個默認的構造函數,只是這個構造函數的函數體是空的,沒有形參,也不執行任何操作,
構造函數必須是public 屬性的,否則創建對象時無法調用。當然設置為private,protected 屬性也不會報錯,但是沒有意義。
構造函數沒有返回值,因為沒有變量來接收,這意味着,構造函數函數名前面不能出現返回值類型,void 也不行,函數體內也不能有return。
比如上面Color類,如果不定義構造函數的時候,編譯器會生成一個
Color(){}
實際上編譯器只有在必要的時候才會生成默認構造函數,而且它的函數體一般不為空。
默認構造函數的目的是幫助編譯器做初始化工作,而不是幫程序員
1、無參構造函數:構造函數內無形參
Color::Color() { m_red = 0;//初始化成員變量 m_green = 0; m_blue = 0; }
2、有參構造函數:r、g、b 是構造函數的三個形參,
一下通過兩種方式定義構造函數
Color(int r, int g, int b)的作用是給三個private屬性的成員變量賦值,要想調用該構造函數,就得在創建對象的同時傳遞實參,並且實參由()包圍,和普通的函數調用類似
在函數體內初始化成員變量
Color::Color(int r, int g, int b) { m_red = r; m_green = g; m_blue = b; }
//在棧上創建3個Color對象, Color Red(255, 0, 0); Color Green(0, 255, 0); Color Blue(0, 0, 255);
通過初始化列表來初始化成員變量,在效率上和在構造函數體內初始化變量是一樣的,沒有優勢,僅僅是在書寫上方便,尤其是成員變量較多時,這種寫法非常簡單明了,但鄙人不敢苟同。
Color::Color(int r, int g, int b) : m_red(r), m_green(g), m_blue(b) { }
構造函數初始化列表還有一個重要的作用,初始化const成員,初始化const成員變量的唯一方法就是使用初始化列表
C++中構造函數和普通函數一樣,允許重載,一個類中有多個重載的構造函數,創建對象時根據傳遞的實參來判斷調用哪個構造函數;
類中定義了構造函數就一定要調用,不調用是錯誤的。如果有多個重載的構造函數,那么創建對象時提供的實參必須和其中的一個構造函數匹配