2011-09-16 83 views
0

我有一些值,例如我在此刻在构造函数中设置的其他一些宽度,高度等。他们目前不是常量,但我希望他们能够做到这一点,所以我现在要改变它们。我应该声明这是const int成员变量的类吗?

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

回答

2

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

如果你做一个私有数据成员const,默认的赋值运算符将无法正常工作,您需要提供一个。

+0

+1:很好的答案。 –

+0

你确定你需要为const成员提供一个拷贝构造函数吗?我认为常量完全可以复制... –

+0

你知道,我只检查了赋值构造函数。你是对的(根据GCC,因为我没有规范记忆) – mkb

-1

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

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

private: 
    const int width; 
}; 

int main() 
{ 
    A(10); 

    return 0; 
} 
+0

错过了这一点。 –

2

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

这是无用的概括。

实例之间的值会不同吗?

  • :使它们成为实例成员;
  • 没有:让他们static成员。

这就是它的全部!

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

是的,但是考虑到使用存取函数做这个来代替。

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

我有一些值,如宽度,高度其他一些中,我在构造函数中设置在此>时刻。他们目前不是常量,但我希望他们能够做到这一点,所以我现在要改变它们。

但我听说,这是不常见的,使这些变量私人常量也没有做私人>静态常量。是这样吗?

所以,如果你真的想他们是恒定的我会做到这一点,通常的方式是:

// 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 
0

既然你在构造函数中设置的变量,它们是特定于实例,因此静态不作任何意义。

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

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

对于声明变量public const和使用const_cast技巧来复制和分配,除非你喜欢由于不适当的编译器优化和const_cast的未定义行为而引起的细微的,深入的,普遍的错误,否则不要考虑。

相关问题