2011-09-16 81 views
0

我有一些值,例如我在此刻在構造函數中設置的其他一些寬度,高度等。他們目前不是常量,但我希望他們能夠做到這一點,所以我現在要改變它們。我應該聲明這是const int成員變量的類嗎?

但是我聽說,在沒有私有靜態常量的情況下將這些變量設置爲私有常量並不常見。是這樣嗎?還是在這種情況下有效?我還需要centerWidth,它將通過將寬度變量除以2來設置。如果我使它們成爲常量,我可以這樣做嗎?

回答

2

這些值是特定於對象的實例,但只在構造函數中設置?然後static沒有意義,因爲每個對象將具有相同的高度和寬度。

如果你做一個私有數據成員const,默認的賦值運算符將無法正常工作,您需要提供一個。

+0

+1:很好的答案。 –

+0

你確定你需要爲const成員提供一個拷貝構造函數嗎?我認爲常量完全可以複製... –

+0

你知道,我只檢查了賦值構造函數。你是對的(根據GCC,因爲我沒有規範記憶) – mkb

-1

如果您不打算通過成員函數更改這些變量,那麼您應該聲明它們const並在構造函數初始化列表中進行初始化。

class A 
{ 
public: 
    A(int w) : width(w) 
    { 
    } 

private: 
    const int width; 
}; 

int main() 
{ 
    A(10); 

    return 0; 
} 
+0

錯過了這一點。 –

2

但是我聽說,在不做私有靜態常量的情況下將這些變量設置爲私有常量並不常見。

這是無用的概括。

實例之間的值會不同嗎?

  • :使它們成爲實例成員;
  • 沒有:讓他們static成員。

這就是它的全部!

我還需要centerWidth,它將通過將寬度變量除以2來設置。如果我使它們成爲常量,我可以這樣做嗎?

是的,但是考慮到使用存取函數做這個來代替。

double T::centerWidth() { 
    return this->width/2; 
} 
1

我有一些值,如寬度,高度其他一些中,我在構造函數中設置在此>時刻。他們目前不是常量,但我希望他們能夠做到這一點,所以我現在要改變它們。

但我聽說,這是不常見的,使這些變量私人常量也沒有做私人>靜態常量。是這樣嗎?

所以,如果你真的想他們是恆定的我會做到這一點,通常的方式是:

// Header 
class Widget 
{ 
public: 
    Widget(); 
    ~Widget(); 

    // rest of your functions/variables 

private: 
    static const int width; 
    static const int height; 

    // rest of your functions/variables 
} 

// Implementation 
const int Widget::width = 640; 
const int Widget::height = 800; 

Widget::Widget() 
{ 
    // do some construction work 
} 

// ... rest of your definitions 

或者是有效的在這種情況下?

這是有效的,如果你聲明static成員將是每一個相同的對象創建類的實例。

我還需要centerWidth,它將通過將寬度變量除以2來設置。我可以這樣做,如果我>使它們爲常量?

是的,你可以使用宣佈運營const正常變量:

const int a = 2; 
int b = 2; 
int c = a + b; // 4 
0

既然你在構造函數中設置的變量,它們是特定於實例,因此靜態不作任何意義。

我知道你想解決什麼問題。您正嘗試向用戶提供對圖像寬度和高度的只讀訪問權限,同時允許對類進行修改。你不能通過聲明成員變量const來做到這一點。所有的修改,包括複製構造和賦值都需要它們是非const的。

一個解決方案是使用公共getter和protected/private setter。在我的班級中,我使用名爲xs()ys()的公共成員函數分別返回xsize和ysize。

對於聲明變量public const和使用const_cast技巧來複制和分配,除非你喜歡由於不適當的編譯器優化和const_cast的未定義行爲而引起的細微的,深入的,普遍的錯誤,否則不要考慮。

相關問題