在类中初始化 const

Posted

技术标签:

【中文标题】在类中初始化 const【英文标题】:Initialized const in a class 【发布时间】:2012-11-28 14:27:16 【问题描述】:

是否可以在classglobal 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 成员就无法更改。否则,就不会是constant,对吧?

【讨论】:

好吧,我也这么想!我不确定。谢谢大家!【参考方案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 &pi;
;

class Bar

    Bar() :
        // Ok, Weird is constructed correctly.
        w(1),
        // Ok, pi is initialized.
        pi(PI)
    ;
    Weird w;
    float &pi;
;

【讨论】:

【参考方案5】:

正如所有其他答案所断言的那样,您无法在初始化后更改 const 类成员的值。不过也有人觉得自己很聪明,用const_cast&lt;&gt;

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的主要内容,如果未能解决你的问题,请参考以下文章

const成员变量

寒假学习笔记

C++ 静态 const 类成员初始化

C++静态成员变量及其初始化

转C++ const成员变量和成员函数(常成员函数)

C++类和对象下