在c ++中通过引用传递类成员时,Const不起作用

问题描述 投票:0回答:2

请考虑以下代码:

#include <iostream>

class ObjectCalculator {
public:
    struct Object {
        int id = 0;
    };
    void setObject(Object& object) const {
        object.id = 1;
    }
    Object m_object;
};

int main() {
    ObjectCalculator objCalc{};
    std::cout << objCalc.m_object.id << std::endl;
    objCalc.setObject(objCalc.m_object);
    std::cout << objCalc.m_object.id << std::endl;
    return 0;
}

我以为这行代码在编译期间会引发错误,因为内部变量是通过const方法setObject进行更改的。

objCalc.setObject(objCalc.m_object);

但是代码编译没有错误并输出:

0
1

[能否请您解释为什么const在这种情况下无效?

c++ const
2个回答
0
投票

const与该类的成员有关。您修改了方法参数,因此可以更改它,而与const无关。

const之后的方法应用于隐式的第一个方法参数this,所有类成员都通过该参数进行访问。

cppreference

非静态成员函数可以用const,volatile,或const volatile限定词(此限定词出现在函数声明中的参数列表)。不同的简历资格函数具有不同的类型,因此可能彼此重载。

在cv限定函数的主体中,此指针为具备简历资格,例如在const成员函数中,仅其他const成员函数可以正常调用。 (非const成员函数可以如果应用const_cast或通过访问路径仍然被调用不涉及此。)


0
投票

const限定词表示该函数未修改this对象。

通过传递对象以将其修改为参数,而您不修改this,则可以修改以参数形式传递的对象。

如果您尝试修改功能中的m_object,则会收到您期望的错误。

© www.soinside.com 2019 - 2024. All rights reserved.