2010-08-13 70 views
7

在C++中,有時我看到類似下面的聲明後不久:常量類型限定符函數名

return_type function_name( datatype parameter1, datatype parameter2 ) const 
{ /*................*/} 

是什麼const型修飾詞確切在這種情況下怎麼辦?

回答

7

$ 9.3.1/3明─

「A非靜態成員函數可以被聲明爲const,易失性或const揮發性的。這些cvqualifiers影響該指針(9.3.2)的類型。它們還影響成員函數的函數類型(8.3.5);聲明爲const的成員函數是const成員函數,聲明爲volatile的成員函數是volatile成員函數,並且聲明爲const volatile的成員函數是常量volatile成員函數。

因此,這裏的總結:

a)一個const限定符可以僅用於類非靜態成員函數

b)中的CV資格功能參與重載

struct X{ 
    int x; 
    void f() const{ 
     cout << typeid(this).name(); 
     // this->x = 2; // error 
    } 
    void f(){ 
     cout << typeid(this).name(); 
     this->x = 2; // ok 
    } 
}; 

int main(){ 
    X x; 
    x.f();   // Calls non const version as const qualification is required 
        // to match parameter to argument for the const version 

    X const xc; 
    xc.f();  // Calls const version as this is an exact match (identity 
        // conversion) 
} 
+0

+ 1爲規範性參考! – 2014-12-20 05:50:25

13

成員函數聲明結尾的const限定符指示可以在本身爲const的對象上調用該函數。 const成員函數承諾不更改任何不可變數據成員的狀態。

const成員函數當然也可以在非const對象上被調用(並且仍然作出相同的承諾)。

成員函數也可以在常量上重載。例如:

class A { 
    public: 
    A(int val) : mValue(val) {} 

    int value() const { return mValue; } 
    void value(int newVal) { mValue = newVal; } 

    private: 
    int mValue; 
}; 

A obj1(1); 
const A obj2(2); 

obj1.value(3); // okay 
obj2.value(3); // Forbidden--can't call non-const function on const object 
obj1.value(obj2.value()); // Calls non-const on obj1 after calling const on obj2 
3

這意味着它不會修改對象,因此您可以使用const對象調用該方法。

class MyClass { 
public: 
    int ConvertToInteger() const; 

}; 

意味着,如果你有

const MyClass myClass; 

你可以叫

int cValue = myClass.ConvertToInteger(); 

沒有編譯錯誤,因爲該方法聲明表示它不會改變對象的數據。

相關問題