2013-02-04 167 views
-2

在C++中,如何聲明類的靜態成員函數爲const相對於該類的成員變量靜態與靜態變量相關的靜態成員函數

考慮下面的簡單例子。

myclass.h:

class myclass 
{ 
    myclass() 
    { 
     myint = 0; 
    } 

    ~myclass() { } 

    int myint; 
    static int my_static_int; 

    void foo(const int yourint) const; 
    static void bar(const int newint); 
}; 

myclass.cpp:

myclass::my_static_int = 0; 

void myclass::foo(const int yourint) const 
{ 
    if (yourint <= myint + my_static_int) 
    std::cerr << "yourint <= myint + my_static_int"; 
    else 
     std::cerr << "yourint > myint + my_static_int"; 

    bar(yourint); 
} 

void myclass:bar(const int newint) 
{ 
    my_static_int = newint; 
} 

的main.cpp

... 
myclass A; 
A.foo(4); 
A.foo(4); 
.. 

輸出將是:

yourint > myint + my_static_int 
yourint <= myint + my_static_int 

顯然,bar可用於const成員函數改變靜態成員變量類的,從而改變常量成員函數foo的結果。

對於my_static_int,您可以聲明bar爲const嗎?

+3

沒有辦法做到這一點,你誤解了'const'的含義。 'const'只意味着這個函數不會修改任何非'mutable'成員變量_,而不是每次調用它時都會「具有相同的輸出」。例如,如果你在'const'成員函數中有一個'static'變量,並在每次調用時遞增並返回它呢?它仍然是'const',但每次都返回一個不同的值。 –

+0

@SethCarnegie沒錯。我問了這個問題,因爲似乎沒有辦法將「常量」靜態成員函數與「非常量」靜態成員函數區分開來,其中「常量」是關於靜態成員變量的。 – cmo

+0

@SethCarnegie不,我沒有理解const的含義。我實際上表明瞭我對這個問題的理解。相反,你顯然沒有閱讀我的問題,因爲你的「評論」僅僅提出了我的問題提出的另一個例子。 – cmo

回答

3

原代碼(我只收拾了格式化):

class myclass 
{ 
    myclass() 
    { 
     myint = 0; 
    } 
    ~myclass() 
    {} 

    int myint; 
    static int my_static_int; 

    void foo(const int yourint) const; 
    static void bar(const int newint); 
}; 

在這個課堂上的一切是private人跡罕至,默認:它是無法使用的。

這就是爲什麼發佈真實代碼如此重要的一個例子。

你然後問:

「你可以聲明barconst相對於my_static_int? 」

是的,但沒有直接的語法。您將不得不使用現有的語言功能。

它們足以完成任務。

class something 
{ 
private: 
    int my_int; 
public: 
    void bar(int const newint) const; 
    something(); 
}; 

class myclass 
{ 
private: 
    int myint; 
    static something; 
public: 
    void foo(int const yourint) const; 
    ~myclass() {} 
    myclass(): myint(0) {} 
}; 
2

你可以聲明bar對my_static_int是靜態的嗎?

編號C++沒有提供這樣的機制。

這深深地困擾着我,因爲人會承擔 const成員函數foo多個電話中的類

你不應該假設不會改變任何事情。 const方法可能會修改靜態變量,因爲這些變量不是正在聲明爲const的實例的一部分。

它也可以修改標記爲mutable的變量。或者已經刪除了const_cast的成員。

const函數可以觀察或修改類之外的變量,因此,在每次調用函數時都不應該考慮const函數的行爲方式。例如,您可以使用const函數返回rand()

this question更好地瞭解C++的const意義