類成員的初始化
首先來看一段代碼:
#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成員的初始值,因此無法進入符號表成爲真正意義上的常量
小插曲
- 初始化與賦值不同
- 初始化:對正在創建的對象進行處置設置
- 賦值:對已經存在的對象進行值設置