0

classaのaglobal 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
}

にを設定することは可能global constです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 に答える