函数名称后不久的const类型限定符
这个问题在这里已经有了答案:
$ 9.3.1 / 3个州 -
“一个非静态成员函数可能被声明为const,volatile或const volatile,这些cvqualifiers影响这个指针的类型(9.3.2),它们也影响成员函数的函数类型(8.3.5);一个成员函数声明的const是一个const成员函数,一个声明为volatile的成员函数是一个volatile成员函数,而一个声明为const volatile的成员函数是一个const 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();
没有编译错误,因为方法声明表明它不会更改对象的数据。
链接地址: http://www.djcxy.com/p/40417.html上一篇: const type qualifier soon after the function name
下一篇: What does const mean following a function/method signature?