为什么const方法可以使用非const引用?

时间:2020-02-12 17:56:43

标签: c++

我知道const方法无法修改调用它的对象。看这段代码:

class A{
    int a;
    public:
        void f(A & a_) const {
        a_.a=5;
        };
};
int main(){
    A x;
    x.f(x);
    return 0;
}

为什么此代码编译?在将方法声明为常量时,为什么还要分配对同一类的非const对象的引用?通常,编译器如何检查函数可以修改对象的所有可能情况?

2 个答案:

答案 0 :(得分:7)

我知道const方法无法修改调用它的对象。

这是一个过分的简化,而且有点不准确。

const函数仅意味着隐式this指针是指向const的指针。

为什么此代码会编译?

因为它的格式正确。

当将方法声明为常量时,为什么还要分配对同一类的非const对象的引用?

因为函数的恒定性不会影响您可以通过引用修改哪些对象。

通常,编译器如何检查函数可以修改对象的所有可能情况?

编译器根本不会进行此类检查。

答案 1 :(得分:5)

const成员函数无法使用“隐式” this参数修改从其调用的对象。 f(...)与免费功能等效(忽略成员可见性)

void f(const A* this, A& _a) {
    _a.a = 5;
}

如果传递与非const指针或引用相同的对象,则仍然可以对其进行修改。