2012-11-28 3 views
0

Возможно ли инициализировать в class a 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?

+1

Если вы можете изменить его после его инициализации, это не будет const. –

+1

Какова большая картина того, что вы пытаетесь достичь? Почему бы просто не использовать метод доступа для ограничения доступа? – RonaldBarzell

+1

В каком смысле 'cs' a * global *? –

ответ

4

No. Вы можете инициализировать его в конструкторе инициализаторе, но когда-то инициировало const член не может быть изменилось. В противном случае это не было бы мусором const, не так ли?

+0

Хорошо, я так думал! Я не был уверен. Всем спасибо! – hofmeister

2

Нет, вы можете установить его только в конструкторе. После строительства он установлен в камне.

3

Это возможно только в конструкторе класса, и только в инициализатора-лист:

A() : cs("Set Value") { 
} 
1

Как уже упоминалось, вам необходимо инициализировать константные элементы объекта, используя его initializer list:

/* a.h */ 
class A { 
private: 
    const string cs; 

public: 
    A(const string &value) : 
     cs(value) // <---- initialize here!. 
    {}; 
}; 

Это то же самое для каждого сопзЬ члена класса:

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') 
     {}; 
}; 

Конструктора список инициализатора также полезно для инициализации других членов, как ссылки O сложных данных, которые не обеспечивают конструктор по умолчанию:

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; 
}; 
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; } 
}; 

с гну и компиляторы Intel, это на самом деле компилируется без предупреждения AFAIK и даже может работать. Но это нарушает правила языка и представляет собой страшный UB (неопределенное поведение). Другими словами, он может не всегда работать так, как предполагалось, поскольку компилятору разрешено считать, что x не изменяется с момента инициализации.

Смежные вопросы