I am learning about initializer list and learnt that const members must be initialized using it, because you cannot initialize it using default constructor or parameterised constructor.
const的成員可以在這兩個默認構造函數和任何parametrised構造函數的成員初始化列表中初始化。 (默認構造函數是可以不帶參數調用構造函數)。
Now suppose if I have another member int x; not a const,Why can't I initialize it using default constructor, What is the idea behind this restriction?
您可以初始化任何數量的成員(有可能是一些實現定義的限制,但它不是有關這個問題),在默認構造方法。沒有你描述的這種限制。
演示,類兩個成員,無論是在默認構造函數初始化:
struct Foo {
const int y;
int x;
Foo(): y(1), x(100){}
};
編輯爲MCVE。
The code that gives error:
class Foo
{
private:
const int y;
int x;
public:
Foo(int yy) :y(yy){}
Foo()
{
x = 100;
}
int getY();
};
所有構造函數必須初始化const的成員。您的參數化構造函數會初始化y
,但默認構造函數不會。這就是爲什麼它不起作用。看到我的演示上面的工作示例。
PS。您的參數化構造函數不會初始化x
,但這是正確的:x
不是常量,因此您可以稍後爲其分配值。
In my code if I have a parameterised constructor like Foo(int xx) { x = xx;}
It will not give any error
此程序:
struct Foo {
const int y;
int x;
Foo(int xx) { x = xx;}
};
病形成在標準C++。如果您的編譯器在沒有警告的情況下接受它,那麼它不符合標準。
「_Why爲什麼我不能使用默認構造函數初始化它?」是的,你可以嗎?你能更清楚一點嗎? –
您可以在默認構造函數中初始化您喜歡的任何成員。我不明白這個問題。請發表一個你認爲不*工作的MCVE。 –
Btw,*「因爲您不能使用默認構造函數或參數化構造函數來初始化它。」*聽起來像對「默認構造函數」這個術語有誤解。 –