我应该将此声明为类的const int成员变量吗?

时间:2011-09-16 13:55:41

标签: c++

此时我在构造函数中设置了一些其他值的宽度,高度等值。它们目前不是常数,但我希望它们是那样,所以我现在就改变它们。

但是我听说在不使用私有静态const的情况下将这些变量设为私有const并不常见。是这样的吗?或者在这种情况下有效吗?我还需要centerWidth,它将通过将width变量除以2来设置。如果我将它们设为常数,我可以这样做吗?

5 个答案:

答案 0 :(得分:2)

这些值是否特定于对象的实例,但仅在构造函数中设置?然后static没有意义,因为每个物体的高度和宽度都相同。

如果您创建私人数据成员const,则默认分配运算符将无法运行,您需要提供一个。

答案 1 :(得分:2)

  

但是我听说在不使用私有静态const的情况下将这些变量设为私有const并不常见。

这是一种无用的概括。

实例之间的值会有所不同吗?

  • :将其设为实例成员;
  • :让他们static成员。

这就是它的全部!

  

我还需要centerWidth,它将通过将width变量除以2来设置。如果我将它们设为常量,我可以这样做吗?

是的,但考虑使用访问者功能来做这件事。

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

答案 2 :(得分:1)

  

我在这个>时刻在构造函数中设置了一些其他值,例如宽度,高度等值。它们目前不是常数,但我希望它们是那样的,所以我现在就改变它们。

     

但我听说如果没有私有的>静态const,那么将这些变量设为私有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

答案 3 :(得分:0)

由于您在构造函数中设置了变量,因此它们是特定于实例的,因此静态没有任何意义。

我知道你要解决的问题是什么。您试图为用户提供对图像宽度和高度的只读访问权限,同时允许从类中进行修改。你不能通过声明成员变量const来做到这一点。所有修改,包括复制构造和赋值都需要它们是非常量的。

一种解决方案是使用公共getter和protected / private setter。在我自己的类中,我使用名为xs()ys()的公共成员函数分别返回xsize和ysize。

除非你喜欢由于编译器优化不当和const_cast的未定义行为而产生的细微,深刻,普遍的错误,否则不要认为声明变量public const和使用const_cast技巧进行复制和分配。

答案 4 :(得分:-1)

如果您不打算通过成员函数更改这些变量,那么您应该声明它们const并在构造函数初始化列表中初始化。

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

private:
  const int width;
};

int main()
{
  A(10);

  return 0;
}