C++類中需要注意的地方

Talk is cheap, show me the code.

  1. 類的靜態成員函數不允許聲明爲const,否則編譯會報錯。當類的非靜態成員函數被聲明爲const, 表明這個非靜態成員函數隱含傳入的this指針爲const指針,即指針指向的對象爲常量, 在函數內部不允許對類的成員變量進行賦值,否則會報錯,並且在類外部實現該非靜態成員函數時也需要加上const聲明,否則編譯也會報錯。

  2. 類class不加修飾符時默認是private的,結構體struct不加修飾符默認是public的。

  3. 關於const和非const變量或對象之間是否能直接賦值的問題。const和非const變量之間時可以直接相互賦值的,因爲賦值只是將變量值進行一次拷貝,但是如果是指針變量的話就需要注意: 不能將const char*變量賦值給char*,雖然賦值的只是對象地址,但是可能會導致指針指向的對象值的改變;可以將char* const 變量賦值給char*,因爲char* const是指向變量的常量指針,賦值只是將指針地址進行拷貝,作用等同於將const int 賦值給int。

  4. std中定義的pair的使用方法:pair是定義在標準庫中的一個結構體,有兩個成員變量first和second,是對兩種類型的一個簡單封裝,構建pair的方式有兩種,一種是直接使用構造函數:

    pair<string, int> p1("lee", 2);

    另一種是採用標準庫中定義的函數make_pair:

    pair<string, int> p2 = make_pair("www", 3);

  5. 構造函數不可以聲明爲const;構造函數可以使用初始化列表進行成員變量初始化: Constructor():member1(val1), member2(val2){};初始化列表中變量初始化的順序只和類成員變量定義的次序有關,和初始化列表中出現的次序無關。

  6. 對於沒有構造函數的類類型成員,const成員或引用類型成員, 必須在構造函數的初始化列表中進行初始化,在構造函數體內進行賦值初始化是無效的。

  7. int i = 1; const int i1 = i; int &i2 = i; 這些都是正確的,但是爲什麼在構造函數中不能通過在函數體內賦值進行初始化,而必須在初始化列表中初始化呢?這是因爲構造函數執行時分兩個階段,一個階段是進行初始化階段,初始化列表就是在初始化階段執行的;另一個階段是普通的計算階段,當進入構造函數體內時其實初始化階段已經結束,進入了普通計算階段。如果只是通過在函數體內對const或引用類型成員賦值,這些成員其實在初始化階段已經被默認初始化成了不確定的值,這裏再進行賦值就會出錯,編譯不通過。

  8. explicit關鍵字只用於類的內部用來修飾構造函數的聲明,構造函數如果再類外部定義無需加上explicit關鍵詞,否則會報錯。explicit關鍵字的作用是不允許隱式轉換。

  9. 對於非浮點型數據類型可以直接類內部初始化靜態常量,但是浮點型就不能直接在類內部初始化靜態常量。靜態變量都不可以在類內部進行初始化。

    class Test1
    {
    public:
    static int a = 1; //error
    static const int b = 1; //right
    static const double c = 1.2; //error
    };
    int Test1::a = 1; //right
    int Test1::c = 1.2; //right

  10. 一般來說,最好顯示或隱式定義默認構造函數和複製構造函數。只有不存在其他構造函數時才合成默認構造函數。如果定義了複製構造函數,也必須定義默認構造函數。沒有複製構造函數將會嚴重限制類的使用,對象只能採用引用的方式作爲函數參數或者返回類型,並且不能作爲容器的元素。 對於帶有指針類型的類尤其需要注意,需要自己定義複製構造函數,因爲編譯器自動合成的複製構造函數將會是賦值指針,而不是賦值指針指向的對象。複製構造函數的形參通產都是const引用類型的,引用類型是必須的,const不一定是必須,但是最好帶上。

  11. 通常需要自己定義析構函數,那麼也需要自己定義複製構造函數和重載賦值操作符,這被稱爲複製控制三原則。編譯器自動合成的析構函數不會自動釋放指針資源,必須自己手動刪除。析構函數中撤銷數組資源時會逐個撤銷數組中每個元素資源,並且是按照從後往前逆序撤銷。

  12. 類中涉及到動態分配資源或者涉及到指針,一般都是需要自己定義複製控制函數(複製構造函數,重載賦值操作符,析構函數)的,因爲動態分配的資源析構函數不會自動回收,包含指針時默認合成的複製構造函數和賦值操作符都是隻複製指針值,而沒有複製指針指向的對象,這樣容易出現垂懸指針。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章