2010-08-09 134 views
5
class arbit 
    { 
     int var; 
     public: 

     int method1(); 
     int method1() const; 

    }; 

爲什麼在這裏聲明兩次相同的函數時g ++不會發出警告?在C++類中重新聲明函數

回答

15

因爲一個是const而另一個不是。這些是不同的重載,具有不同的簽名。其中一個或另一個被調用,具體取決於您所調用的對象是否爲const

實施例:

arbit x; 
x.method1(); // calls the non-const version 
arbit const &y = x; 
y.method1(); // calls the const version 

你應該聲明的方法如const,如果它不修改該對象的(可見)狀態。這可以讓你發放const arbit個對象,並確保有人不會意外修改它們。例如,您將生成一個功能setValueconst(因爲它修改了該對象),但getValue將爲const。因此,在const對象上,您可以調用getValue而不是setValue


¹當有意願時,有一種方法,它叫做const_cast。但忘記我曾告訴過你。

+0

燁,C++對待常量作爲過載參數 – Digikata 2010-08-09 19:35:08

+0

重載上' const'可能非常有用。例如,檢查'std :: vector'中的operator []'。 – 2010-08-09 19:38:33

+1

可以爲const和 和nonconst對象調用const成員函數,而nonconst成員函數只能針對非常用對象調用。 \t 現在我該如何從非常量對象x調用method1函數的const版本。它是const_cast,它可以爲我做所需的操作? – Amit 2010-08-09 19:43:28

3

也可以與volatile改性劑和兩者的組合超載:const volatile

#include <iostream> 
using namespace std; 

class foo { 
public: 
    void bar()    { cout << "bar()" << endl; } 
    void bar() const   { cout << "bar() const" << endl; } 
    void bar() volatile  { cout << "bar() volatile" << endl; } 
    void bar() const volatile { cout << "bar() const volatile" << endl; } 
}; 

int main() { 
    foo f; 
    f.bar(); 

    foo const f_const; 
    f_const.bar(); 

    foo volatile f_volatile; 
    f_volatile.bar(); 

    foo const volatile f_const_volatile; 
    f_const_volatile.bar(); 
} 

也就是說將輸出:

bar() 
bar() const 
bar() volatile 
bar() const volatile