2015-08-13 78 views
-2

嗯,這可能會懷疑可能有重疊,相當數量的這些問題:如何在構造的C++類中設置一個const成員變量?

how to initialize const member variable in a class C++
Const Member Variables in C++11
Initializing a const member variable after object construction

然而,這些都不能夠回答我原來的問題。主要區別在於我不想用設定值初始化,但使用構造函數參數。

我想要做的是一樣的東西這個 -

class myRectangle { 
private: 
    const int length; //const mainly for "read-only" like 
    const int breadth; //protection 
public: 
    myRectangle(int init_length, int init_breadth); 
    int calcArea(void); 
    void turn90Degrees(void); 
    /* and so on*/ 

}

其中兩個長度和寬度都有點只讀保護,施工後改變他們。
但當然我的編譯器不會允許我將它們設置在構造函數中,因爲它們實際上是const ...
我想出了一個解決方法,只留下它們變量,只實現getter方法,因此它們不能有效被改變,但我幾乎覺得我錯過了這裏明顯的解決方案。

另外我覺得我在某種程度上誤解了const的使用。那麼它是否已經是一個編譯時合同,不會改變那裏的數據呢?因爲根據我的理解,不知道常量在執行程序時是否需要足夠的信息?

而順便說一句,使恆定靜態的解決方案不適合我,因爲我產生的每個矩形應該有不同的大小。

謝謝您的回答和澄清!

解決方案:初始化器列表/委託構造

MSDN Entry of the solution from Jason R

+1

「但是當然,我的編譯器不允許我在構造函數中設置它們,因爲它們實際上是const ...」當然它會。只要確保你*初始化*他們,而不是分配給他們。 – juanchopanza

+0

你能解釋*爲什麼* [這個問題](http://stackoverflow.com/q/14495536/3953764)不回答你的? –

+0

@Piotr Skotnicki因爲他想用一個設定值初始化const(在他的情況下是100) - 我自己在我的程序中不知道它會有什麼價值 – Saltus

回答

4

使用在構造函數初始化列表。

class myRectangle { 
private: 
    const int length; //const mainly for "read-only" like 
    const int breadth; //protection 
public: 
    myRectangle(int init_length, int init_breadth) : 
     length(init_length), breadth(init_breadth) 
    { 
     // rest of constructor body can go here; `length` and `breadth` 
     // are already initialized by the time you get here 
    } 
    int calcArea(void); 
    void turn90Degrees(void); 
}; 
+0

感謝您的快速響應。不知怎的,我需要更好地習慣了stackoverflow搜索功能。現在,在我發佈困擾我的問題幾天之後,我很快就找到了答案。因爲我沒有意識到「授權構造函數」這個術語,並且從來沒有聽說過這方面的初始化列表,所以我不知道要尋找什麼。如果你搜索「帶引擎的自行車」,你似乎很難找到一個「摩托車」...... – Saltus

+1

但至於你的答案:是否有可能在類聲明之外聲明構造函數體?如果是這樣,它會是什麼樣子? – Saltus

+0

@Saltus myRectangle :: myRectangle(int init_length,int init_breadth):length(init_length),breadth(init_breadth){} – kim366

相關問題