为什么常量方法可以采用非常量引用?

Why can a const method take a non const reference?

本文关键字:常量 非常 引用 方法 为什么      更新时间:2023-10-16

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

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

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

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

这是一种过于简化,而且有点不准确。

const函数仅表示隐式this指针是指向const的指针。

为什么要编译此代码?

因为它的格式很好。

为什么在将方法声明为常量时,我甚至可以分配对同一类的非 const 对象的引用?

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

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

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

const成员函数不能使用"隐式"this参数修改从中调用它的对象。f(...)(忽略成员可见性(等同于 free 函数

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

如果将同一对象作为非常量指针或引用传递,则仍允许对其进行修改。