请考虑以下代码:
#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
在这种情况下无效?
const
与该类的成员有关。您修改了方法参数,因此可以更改它,而与const
无关。
const
之后的方法应用于隐式的第一个方法参数this
,所有类成员都通过该参数进行访问。
非静态成员函数可以用const,volatile,或const volatile限定词(此限定词出现在函数声明中的参数列表)。不同的简历资格函数具有不同的类型,因此可能彼此重载。
在cv限定函数的主体中,此指针为具备简历资格,例如在const成员函数中,仅其他const成员函数可以正常调用。 (非const成员函数可以如果应用const_cast或通过访问路径仍然被调用不涉及此。)
const
限定词表示该函数未修改this
对象。
通过传递对象以将其修改为参数,而您不修改this
,则可以修改以参数形式传递的对象。
如果您尝试修改功能中的m_object
,则会收到您期望的错误。