在C++中,有時我看到類似下面的聲明後不久:常量類型限定符函數名
return_type function_name( datatype parameter1, datatype parameter2 ) const
{ /*................*/}
是什麼const型修飾詞確切在這種情況下怎麼辦?
在C++中,有時我看到類似下面的聲明後不久:常量類型限定符函數名
return_type function_name( datatype parameter1, datatype parameter2 ) const
{ /*................*/}
是什麼const型修飾詞確切在這種情況下怎麼辦?
$ 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)
}
成員函數聲明結尾的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
這意味着它不會修改對象,因此您可以使用const對象調用該方法。
即
class MyClass {
public:
int ConvertToInteger() const;
};
意味着,如果你有
const MyClass myClass;
你可以叫
int cValue = myClass.ConvertToInteger();
沒有編譯錯誤,因爲該方法聲明表示它不會改變對象的數據。
+ 1爲規範性參考! – 2014-12-20 05:50:25