2016-09-28 115 views
1

我正在學習初始化程序列表,並獲悉必須使用它初始化const成員,因爲您無法使用默認構造函數或參數化構造函數初始化它。爲什麼沒有其他構造函數被允許?

class Foo 
{ 
private: 
    const int y;    
public:   
    Foo(int yy) :y(yy){}   
    int getY(); 
}; 

現在假設,如果我有另一個成員int x;不是一個常量,爲什麼我不能初始化使用默認的構造函數它,這是什麼限制背後的想法?

,讓錯誤代碼:

class Foo 
{ 
private: 
    const int y;  
    int x; 
public:  
    Foo(int yy) :y(yy){} 
    Foo() 
    { 
     x = 100; 
    } 
    int getY(); 
}; 
+4

「_Why爲什麼我不能使用默認構造函數初始化它?」是的,你可以嗎?你能更清楚一點嗎? –

+2

您可以在默認構造函數中初始化您喜歡的任何成員。我不明白這個問題。請發表一個你認爲不*工作的MCVE。 –

+0

Btw,*「因爲您不能使用默認構造函數或參數化構造函數來初始化它。」*聽起來像對「默認構造函數」這個術語有誤解。 –

回答

4

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++。如果您的編譯器在沒有警告的情況下接受它,那麼它不符合標準。

+1

*「可能有一些實現定義的限制,但與此問題無關」*當天有趣的事實:C++ 14的附錄B建議此限制至少爲6144. –

+0

您錯了我的朋友。 –

+0

當你說所有的構造函數都必須初始化const成員。 –

1

不清楚你想完成什麼。 下面的代碼只是編譯

class Foo 
{ 
private: 
    int _nonConst; 
    const int _const; 

public: 
    Foo() : _const(10), _nonConst(11) 
    { 

    } 

    Foo(int x) : _const(x), _nonConst(x) 
    { 

    } 
}; 
0

我不知道我正確的理解這個問題。總結一下你能做什麼,不能做什麼:

// .h 
class MyClass 
{ 
private: 
    int x; 
    const int y; 

public: 
    MyClass(); 
    MyClass(int initValue); 
}; 

// .cpp 
// The following is legal 
MyClass::MyClass() 
: x(0), y(0) 
{}  

// Alternatively, the following is legal too. 
MyClass::MyClass() 
: y(0) 
{ 
    x = 0; 
} 

// This is not legal: y cannot be initialized that way as it is const. 
// No problem for x though. 
MyClass::MyClass() 
{ 
    x = 0; 
    y = 0; // You cannot do that 
} 

// The following is legal 
MyClass::MyClass(int initValue) 
: x(initValue), y(initValue) 
{}  

// Alternatively, the following is legal too. 
MyClass::MyClass(int initValue) 
: y(initValue) 
{ 
    x = initValue; 
} 

// This is not legal: y cannot be initialized that way as it is const. 
// No problem for x though. 
MyClass::MyClass(int initValue) 
{ 
    x = initValue; 
    y = initValue; // You cannot do that 
} 

當然,你只能有一個CTor或每個聲明的簽名。上面的例子是3種選擇 - 每個聲明的簽名有2個合法的和1個非法的。

相關問題