2014-06-15 87 views
5

如果已经分配的const变量仍然可以重新分配,那么它不是一个常量?举个例子:为什么声明为类成员的const变量仍然可以修改?

struct ss 
{ 
    const int m = 1024; 

    ss() 
    { 
    } 

    ss(int m) : m(m) 
    { 
    } 
}; 



ss sa; 
ss sb(-1); 

cout << sa.m << endl; 
cout << sb.m << endl; 

哇,毕竟不是一成不变!

> /* Ouput: 
> 
> 1024 
> -1 
> 
> */ 
+1

重新分配?你永远不会重新分配它。 – chris

+3

相关[在新的C++ 11成员初始化功能在声明使初始化列表过时?](http://stackoverflow.com/questions/24149924/has-the-new-c11-member-initialization-feature-at -declaration制-initializati/24150137#24150137)。 –

+8

此代码中没有赋值或重新分配。只有初始化,每个变量只发生一次。 –

回答

11
ss(int m) : m(m) 
{ 
} 

这是说,当类ss被初始化,其成员m使用参数m被初始化。成员m确实无法修改,但可以初始化,就像任何其他const对象一样。请注意,如果我们这样做,而不是

ss(int m) 
{ 
    this->m = m; 
} 

那么我们将有一个问题,因为被初始化ss::m需求。如果ss::m是一个默认的构造函数的类,然后在

ss(FooClass m) 
{ 
    this->m = m; 
} 

它是确定不初始化ss::m明确(因为它将是缺省构造的),但在构造函数体线将被拒绝因为它在已经初始化之后会修改ss::m

编辑:哎呀,我不明白你原来的问题。

支架 - 或等于初始值设定

const int m = 1024; 

如果构件未在构造函数-初始化提及,仅使用。换句话说,由于默认构造函数没有明确初始化m,因此使用值1024。但是ss::ss(int)明确地初始化了m,所以括号或相等初始化程序被忽略。

+3

您没有解决'const int m = 1024;'这一行,这是问题的关键。 – user2357112

+0

@ user2357112对不起,请参阅编辑 – Brian

+0

+1,但最后您的术语错误。 * mem-initializer *是构造函数初始值设定项列表中的初始值设定项。非静态数据成员初始值设定项是* brace-equal-initializer *。 – Praetorian

5

你举的例子只是初始化的不同模式的交易,没有调动发生在这里。你们看到正在优于类成员初始化,我们可以从draft C++ standard部分12.6.2初始化基地和成员款它说看到构造函数初始化列表的效果:

如果给定的非静态数据成员既具有 支架 - 或等于初始值设定和MEM-初始化,由MEM-初始化指定的初始化 被执行,并且非静态数据 构件的支架 - 或等于初始值设定被忽略。 [实施例:鉴于

struct A { 
int i =/some integer expression with side effects/; 
A(int arg) : i(arg) { } 
// ... 
}; 

的A(int)构造将简单地初始化i到精氨酸, 的值和副作用在我的大括号orequal-初始化不会采取 地方。末端示例]

Has the new C++11 member initialization feature at declaration made initialization lists obsolete?此讨论的是一个有用的特征,因为它允许你为默认成员变量,然后覆盖基于被调用的构造这些默认值。

相关问题