12、不一樣的C++系列--初始化列表

類成員的初始化


首先來看一段代碼:

#include <stdio.h>

class Test
{
private:
    const int ci;
public:
    Test()
    {
        ci = 10;
    }
    int getCI() 
    { 
        return ci; 
    }
};


int main()
{
    Test t;

    printf("t.ci = %d\n", t.getCI());

    return 0;
}

請問上述代碼可以執行麼?
答案是不可以,因爲在Test類初始化時必須明確的初始化ci。問題來了,構造函數中已經給ci賦值了呀!可是再仔細想想ci是const屬性修飾,不能直接對它賦值。所以,就必須在類初始化時賦初值。

  • C++提供了初始化列表對成員變量進行初始化
  • 語法規則
ClassName::ClassName():
            m1(v1), m2(v1, v2), m3(v3)
{
    // some other initialize operation
}
  • 注意事項
    • 成員的初始化順序與成員的聲明順序相同
    • 成員的初始化順序與初始化列表中的位置無關
    • 初始化列表先於構造函數的函數體執行

舉個例子:

#include <stdio.h>

class Value
{
private:
    int mi;
public:
    Value(int i)
    {
        printf("i = %d\n", i);
        mi = i;
    }
    int getI()
    {
        return mi;
    }
};

class Test
{
private:
    Value m2;
    Value m3;
    Value m1;
public:

    //這裏雖然是m1(1) , m2(2), m3(3),看似是依次對m1 m2 m3初始化
    //但是初始化的順序是 由聲明的順序決定的
    Test() : m1(1), m2(2), m3(3)
    {
        printf("Test::Test()\n");
    }
};


int main()
{
    Test t;

    return 0;
}

運行結果如下:

i = 2
i = 3
i = 1
Test::Test()

類中的const成員


  • 類中的const成員會被分配空間的
  • 類中的const成員的本質是隻讀變量
  • 類中的const成員只能在初始化列表中指定初始值
  • 編譯器無法直接得到const成員的初始值,因此無法進入符號表成爲真正意義上的常量

小插曲

  • 初始化與賦值不同
    • 初始化:對正在創建的對象進行處置設置
    • 賦值:對已經存在的對象進行值設置
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章