我有一些值,例如我在此刻在構造函數中設置的其他一些寬度,高度等。他們目前不是常量,但我希望他們能夠做到這一點,所以我現在要改變它們。我應該聲明這是const int成員變量的類嗎?
但是我聽說,在沒有私有靜態常量的情況下將這些變量設置爲私有常量並不常見。是這樣嗎?還是在這種情況下有效?我還需要centerWidth,它將通過將寬度變量除以2來設置。如果我使它們成爲常量,我可以這樣做嗎?
我有一些值,例如我在此刻在構造函數中設置的其他一些寬度,高度等。他們目前不是常量,但我希望他們能夠做到這一點,所以我現在要改變它們。我應該聲明這是const int成員變量的類嗎?
但是我聽說,在沒有私有靜態常量的情況下將這些變量設置爲私有常量並不常見。是這樣嗎?還是在這種情況下有效?我還需要centerWidth,它將通過將寬度變量除以2來設置。如果我使它們成爲常量,我可以這樣做嗎?
這些值是特定於對象的實例,但只在構造函數中設置?然後static
沒有意義,因爲每個對象將具有相同的高度和寬度。
如果你做一個私有數據成員const
,默認的賦值運算符將無法正常工作,您需要提供一個。
如果您不打算通過成員函數更改這些變量,那麼您應該聲明它們const
並在構造函數初始化列表中進行初始化。
class A
{
public:
A(int w) : width(w)
{
}
private:
const int width;
};
int main()
{
A(10);
return 0;
}
錯過了這一點。 –
但是我聽說,在不做私有靜態常量的情況下將這些變量設置爲私有常量並不常見。
這是無用的概括。
實例之間的值會不同嗎?
static
成員。這就是它的全部!
我還需要centerWidth,它將通過將寬度變量除以2來設置。如果我使它們成爲常量,我可以這樣做嗎?
是的,但是考慮到使用存取函數做這個來代替。
double T::centerWidth() {
return this->width/2;
}
我有一些值,如寬度,高度其他一些中,我在構造函數中設置在此>時刻。他們目前不是常量,但我希望他們能夠做到這一點,所以我現在要改變它們。
但我聽說,這是不常見的,使這些變量私人常量也沒有做私人>靜態常量。是這樣嗎?
所以,如果你真的想他們是恆定的我會做到這一點,通常的方式是:
// 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
既然你在構造函數中設置的變量,它們是特定於實例,因此靜態不作任何意義。
我知道你想解決什麼問題。您正嘗試向用戶提供對圖像寬度和高度的只讀訪問權限,同時允許對類進行修改。你不能通過聲明成員變量const來做到這一點。所有的修改,包括複製構造和賦值都需要它們是非const的。
一個解決方案是使用公共getter和protected/private setter。在我的班級中,我使用名爲xs()
和ys()
的公共成員函數分別返回xsize和ysize。
對於聲明變量public const和使用const_cast技巧來複制和分配,除非你喜歡由於不適當的編譯器優化和const_cast的未定義行爲而引起的細微的,深入的,普遍的錯誤,否則不要考慮。
+1:很好的答案。 –
你確定你需要爲const成員提供一個拷貝構造函數嗎?我認爲常量完全可以複製... –
你知道,我只檢查了賦值構造函數。你是對的(根據GCC,因爲我沒有規範記憶) – mkb