我有一些值,例如我在此刻在构造函数中设置的其他一些宽度,高度等。他们目前不是常量,但我希望他们能够做到这一点,所以我现在要改变它们。我应该声明这是const int成员变量的类吗?
但是我听说,在没有私有静态常量的情况下将这些变量设置为私有常量并不常见。是这样吗?还是在这种情况下有效?我还需要centerWidth,它将通过将宽度变量除以2来设置。如果我使它们成为常量,我可以这样做吗?
我有一些值,例如我在此刻在构造函数中设置的其他一些宽度,高度等。他们目前不是常量,但我希望他们能够做到这一点,所以我现在要改变它们。我应该声明这是const int成员变量的类吗?
但是我听说,在没有私有静态常量的情况下将这些变量设置为私有常量并不常见。是这样吗?还是在这种情况下有效?我还需要centerWidth,它将通过将宽度变量除以2来设置。如果我使它们成为常量,我可以这样做吗?
这些值是特定于对象的实例,但只在构造函数中设置?然后static
没有意义,因为每个对象将具有相同的高度和宽度。
如果你做一个私有数据成员const
,默认的赋值运算符将无法正常工作,您需要提供一个。
如果您不打算通过成员函数更改这些变量,那么您应该声明它们const
并在构造函数初始化列表中进行初始化。
class A
{
public:
A(int w) : width(w)
{
}
private:
const int width;
};
int main()
{
A(10);
return 0;
}
错过了这一点。 –
但是我听说,在不做私有静态常量的情况下将这些变量设置为私有常量并不常见。
这是无用的概括。
实例之间的值会不同吗?
static
成员。这就是它的全部!
我还需要centerWidth,它将通过将宽度变量除以2来设置。如果我使它们成为常量,我可以这样做吗?
是的,但是考虑到使用存取函数做这个来代替。
double T::centerWidth() {
return this->width/2;
}
我有一些值,如宽度,高度其他一些中,我在构造函数中设置在此>时刻。他们目前不是常量,但我希望他们能够做到这一点,所以我现在要改变它们。
但我听说,这是不常见的,使这些变量私人常量也没有做私人>静态常量。是这样吗?
所以,如果你真的想他们是恒定的我会做到这一点,通常的方式是:
// 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,它将通过将宽度变量除以2来设置。我可以这样做,如果我>使它们为常量?
是的,你可以使用宣布运营const
正常变量:
const int a = 2;
int b = 2;
int c = a + b; // 4
既然你在构造函数中设置的变量,它们是特定于实例,因此静态不作任何意义。
我知道你想解决什么问题。您正尝试向用户提供对图像宽度和高度的只读访问权限,同时允许对类进行修改。你不能通过声明成员变量const来做到这一点。所有的修改,包括复制构造和赋值都需要它们是非const的。
一个解决方案是使用公共getter和protected/private setter。在我的班级中,我使用名为xs()
和ys()
的公共成员函数分别返回xsize和ysize。
对于声明变量public const和使用const_cast技巧来复制和分配,除非你喜欢由于不适当的编译器优化和const_cast的未定义行为而引起的细微的,深入的,普遍的错误,否则不要考虑。
+1:很好的答案。 –
你确定你需要为const成员提供一个拷贝构造函数吗?我认为常量完全可以复制... –
你知道,我只检查了赋值构造函数。你是对的(根据GCC,因为我没有规范记忆) – mkb