在类中初始化 const
Posted
技术标签:
【中文标题】在类中初始化 const【英文标题】:Initialized const in a class 【发布时间】:2012-11-28 14:27:16 【问题描述】:是否可以在class
和global const
中初始化class method
?我想在我的class
中使用一种方法来设置const
。
我的想法是:
/* a.h */
class A
private:
const string cs;
public:
A();
~A();
bool cs(const string &host, ...)
;
/* a.cpp */
A::A()
A::~A()
bool cs(const string &host, ...)
/* check some values */
cs = "Set Vaule"; //Doesnt work, get an compiler error
是否可以在method
中设置global const
?
【问题讨论】:
如果你可以在初始化后更改它,它就不会是 const。 您想要完成的工作的大局是什么?为什么不直接使用访问器方法来限制访问? 在什么意义上cs
是一个全局?
您对“全球”世界的使用似乎暴露了您的一些困惑。您确实知道您的班级A
的每个实例都有cs
的不同副本,对吗?其次,应避免将函数命名为与变量相同的名称。
【参考方案1】:
没有。您可以在构造函数初始化程序中对其进行初始化,但一旦初始化,const
成员就无法更改。否则,就不会是const
ant,对吧?
【讨论】:
好吧,我也这么想!我不确定。谢谢大家!【参考方案2】:这只有在你的类的构造函数中才有可能,而且只有在初始化列表中:
A() : cs("Set Value")
【讨论】:
【参考方案3】:不,你只能在构造函数中设置它。建好后,一成不变。
【讨论】:
【参考方案4】:如前所述,您需要使用对象的initializer list 来初始化对象的 const 成员:
/* a.h */
class A
private:
const string cs;
public:
A(const string &value) :
cs(value) // <---- initialize here!.
;
;
对于类的每个 const 成员都是一样的:
class A
private:
const string cs;
const float numberofthebeast;
const char z;
public:
A(const string &value, const float number, const char character) :
cs(value),
numberofthebeast(number),
z(character)
;
;
如果你不想提供构造函数来初始化每个值,你可以在默认构造函数中提供一个默认值,但记住构造后不能更改值:
class A
private:
const string cs;
const float numberofthebeast;
const char z;
public:
A(const string &value, const float number, const char character) :
cs(value),
numberofthebeast(number),
z(character)
;
// Default values!!!
A() :
cs("default ctor"),
numberofthebeast(666.666f),
z('Z')
;
;
构造函数初始化器列表对于初始化其他成员也很有用,例如引用或不提供默认构造函数的复杂数据:
const unsigned float PI = 3.14f;
class Weird
Weird (int w);
// no default ctor!
int W;
;
class Foo
// Error: weird doesn't provide default ctor,
Weird w;
// Error: reference uninitialized.
float π
;
class Bar
Bar() :
// Ok, Weird is constructed correctly.
w(1),
// Ok, pi is initialized.
pi(PI)
;
Weird w;
float π
;
【讨论】:
【参考方案5】:正如所有其他答案所断言的那样,您无法在初始化后更改 const
类成员的值。不过也有人觉得自己很聪明,用const_cast<>
class A
const int x;
public:
A(int _x) : x(_x)
void change_x(int _x) // change x ?!
const_cast<int&>(x) = _x;
;
使用 gnu 和 intel 编译器,这实际上可以在没有警告 AFAIK 的情况下编译,甚至可以工作。但这违反了语言规则并构成了可怕的 UB(未定义行为)。换句话说,它可能并不总是按预期工作,因为允许编译器假设 x
自初始化以来未更改。
【讨论】:
以上是关于在类中初始化 const的主要内容,如果未能解决你的问题,请参考以下文章