0

Is it possible to initialize in a class a global const in a class method? I would like to use a method in my class to set the const.

My idea was:

/* 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
}

Is It possible to set a global const in a method?

4

5 回答 5

4

不,您可以在构造函数初始化程序中对其进行初始化,但一旦初始化,const成员就无法更改。否则,它就不会是const蚂蚁了,不是吗?

于 2012-11-28T14:29:18.677 回答
3

这仅在您的类的构造函数中是可能的,并且仅在初始化列表中:

A() : cs("Set Value") {
}
于 2012-11-28T14:28:55.467 回答
2

不,您只能在构造函数中设置它。施工后,它是一成不变的。

于 2012-11-28T14:28:39.387 回答
1

如前所述,您需要使用其初始化列表来初始化对象的 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;
};
于 2012-11-28T14:48:44.173 回答
0

正如所有其他答案所断言的那样,您无法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自初始化以来它没有改变。

于 2012-11-28T15:51:42.380 回答