【问题标题】:Why can a const method take a non const reference?为什么 const 方法可以采用非 const 引用?
【发布时间】:2020-02-12 17:56:43
【问题描述】:

我知道 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 适用于this,只要this 没有被更改,就可以了。请注意,this 和传入的a被认为是相同的。
  • f() 的参数可以是给定类型的任何对象。没有法律规定只能将this 作为参数传递给它。
  • 我想可能存在混叠违规。如果f 方法正在对a_.a 进行操作,然后与它自己的a 成员进行比较。

标签: c++


【解决方案1】:

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

这过于简单化了,而且有些不准确。

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

为什么这段代码会编译?

因为它格式正确。

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

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

一般而言,编译器如何检查函数可以修改对象的所有可能情况?

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

【讨论】:

  • mutable 上添加一个部分也可能有意义。
【解决方案2】:

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

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

如果您将相同的对象作为非常量指针或引用传递,您仍然可以修改它。

【讨论】:

    猜你喜欢
    • 2018-10-24
    • 2020-06-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-14
    • 1970-01-01
    • 2016-12-26
    • 1970-01-01
    相关资源
    最近更新 更多