2012-11-28 54 views
0

是否可以在class中初始化一個 class method?我想使用我的class中的方法來設置const在一個類中初始化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

號你可以在構造函數初始化初始化它,但一旦初始化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!. 
    {}; 
}; 

它是類的每一個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') 
     {}; 
}; 

構造函數初始化列表也是有用的初始化其他成員,如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; } 
}; 

與GNU和英特爾編譯器,這實際上編譯沒有AFAIK警告,甚至可能工作。但是這違反了語言規則,構成了可怕的UB(未定義的行爲)。換句話說,它可能並不總是按預期工作,因爲編譯器被允許假設x自初始化以來沒有改變。