此时我在构造函数中设置了一些其他值的宽度,高度等值。它们目前不是常数,但我希望它们是那样,所以我现在就改变它们。
但是我听说在不使用私有静态const的情况下将这些变量设为私有const并不常见。是这样的吗?或者在这种情况下有效吗?我还需要centerWidth,它将通过将width变量除以2来设置。如果我将它们设为常数,我可以这样做吗?
答案 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;
}