我知道const方法无法修改调用它的对象。看这段代码:
class A{
int a;
public:
void f(A & a_) const {
a_.a=5;
};
};
int main(){
A x;
x.f(x);
return 0;
}
为什么此代码编译?在将方法声明为常量时,为什么还要分配对同一类的非const对象的引用?通常,编译器如何检查函数可以修改对象的所有可能情况?
答案 0 :(得分:7)
我知道const方法无法修改调用它的对象。
这是一个过分的简化,而且有点不准确。
const
函数仅意味着隐式this
指针是指向const
的指针。
为什么此代码会编译?
因为它的格式正确。
当将方法声明为常量时,为什么还要分配对同一类的非const对象的引用?
因为函数的恒定性不会影响您可以通过引用修改哪些对象。
通常,编译器如何检查函数可以修改对象的所有可能情况?
编译器根本不会进行此类检查。
答案 1 :(得分:5)
const
成员函数无法使用“隐式” this
参数修改从其调用的对象。 f(...)
与免费功能等效(忽略成员可见性)
void f(const A* this, A& _a) {
_a.a = 5;
}
如果传递与非const指针或引用相同的对象,则仍然可以对其进行修改。