C++構造函數的幾種使用方法


在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++中構造函數和普通函數一樣,允許重載,一個類中有多個重載的構造函數,創建對象時根據傳遞的實參來判斷調用哪個構造函數;

類中定義了構造函數就一定要調用,不調用是錯誤的。如果有多個重載的構造函數,那么創建對象時提供的實參必須和其中的一個構造函數匹配

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM