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



我现在在构造函数中设置了一些值,例如宽度,高度等。它们目前不是常量,但我希望它们是常量,所以我现在将更改它们。

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

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

如果您创建私有数据成员const,则默认赋值操作符将不起作用,您需要提供一个。

但是我听说不做私有静态const就把这样的变量设为私有const是不常见的。

那是无用的概括。

实例之间的值不同吗?

  • :使它们成为实例成员;
  • No:设置为static成员

这就是它的全部!

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

可以,但是可以考虑用访问器函数来代替。

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

我在构造函数中设置了一些值,比如宽度、高度和其他一些值。它们目前不是常量,但我希望它们是常量,所以现在我将更改它们。

但是我听说不同时做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

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

class A
{
public:
  A(int w) : width(w)
  {
  }
private:
  const int width;
};
int main()
{
  A(10);
  return 0;
}

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

我知道你想解决什么问题。您正在尝试为用户提供对图像的宽度和高度的只读访问,同时允许从类进行修改。你不能通过声明成员变量const来做到这一点。所有的修改,包括复制构造和赋值,都需要它们为非const。 一个解决方案是使用一个公共的getter和一个受保护/私有的setter。在我自己的类中,我使用名为xs()ys()的公共成员函数分别返回xsize和ysize。

甚至不要考虑将变量声明为public const并使用const_cast技巧进行复制和赋值,除非你喜欢由不适当的编译器优化和const_cast未定义的行为引起的微妙的、深刻的、普遍的bug。

最新更新