我现在在构造函数中设置了一些值,例如宽度,高度等。它们目前不是常量,但我希望它们是常量,所以我现在将更改它们。
但是我听说不做私有静态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。