![](/img/trans.png)
[英]How can I improve this design that forces me to declare a member function const and declare variables mutable?
[英]Should I declare this as const int member variables of the class?
我現在在構造函數中設置了一些值,例如width,height。 它們目前不是常數,但我希望它們是常數,所以現在將對其進行更改。
但是我聽說,不同時進行私有靜態const的情況下,將此類變量設為private const是不常見的。 是這樣嗎 還是在這種情況下有效? 我還需要centerWidth,它將通過將width變量除以2來設置。如果我將它們設為常數,可以這樣做嗎?
這些值是特定於對象實例的,而是僅在構造函數中設置的嗎? 那么static
就沒有意義,因為每個對象的高度和寬度都相同。
如果將私有數據成員const
為默認值,則默認賦值運算符將不起作用,並且需要提供一個。
但是我聽說,不同時進行私有靜態const的情況下,將此類變量設為private const是不常見的。
那是無用的概括。
實例之間的值會有所不同嗎?
static
成員。 這里的所有都是它的!
我還需要centerWidth,它將通過將width變量除以2來設置。如果我將它們設為常數,可以這樣做嗎?
是的,但是請考慮使用訪問器函數來執行此操作。
double T::centerWidth() {
return this->width / 2;
}
我在此時刻在構造函數中設置了一些值,例如width,height。 它們目前不是常數,但我希望它們是常數,所以現在將對其進行更改。
但是我聽說,在不進行private> static const的情況下,將此類變量設為private const是不常見的。 是這樣嗎
因此,如果您實際上希望它們保持不變,通常我會這樣做:
// 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,它將通過將width變量除以2來設置。如果我使它們成為常數,可以這樣做嗎?
是的,您可以像往常一樣在操作中使用聲明為const
的變量:
const int a = 2;
int b = 2;
int c = a + b; // 4
由於您是在構造函數中設置變量的,因此它們是特定於實例的,因此static沒有任何意義。
我知道您要解決什么問題。 您試圖為用戶提供對圖像寬度和高度的只讀訪問權限,同時允許從類中進行修改。 您不能通過聲明成員變量const來做到這一點。 所有修改,包括副本構造和分配,都需要使其為非常量。
一種解決方案是使用公共獲取器和受保護/私有設置器。 在我自己的類中,我使用稱為xs()
和ys()
的公共成員函數分別返回xsize和ysize。
甚至不必考慮將變量聲明為public const並使用const_cast技巧進行復制和分配,除非您喜歡因編譯器優化不當以及const_cast的未定義行為而引起的細微,深入,普遍的錯誤。
如果不打算通過成員函數更改這些變量,則應聲明它們const
並在構造函數初始化列表中進行初始化。
class A
{
public:
A(int w) : width(w)
{
}
private:
const int width;
};
int main()
{
A(10);
return 0;
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.