簡體   English   中英

我應該將其聲明為類的const int成員變量嗎?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM