【发布时间】:2021-06-04 21:58:26
【问题描述】:
为什么这段代码不会产生编译错误:
class C
{
int _i{ 123 };
int* ptr{ &_i };
public:
int& i() const { return *ptr; }
};
int main()
{
C const c;
c.i() += 321;
return c.i();
}
标准中有关于这种行为的文字吗?当然,指向可以直接访问的成员可能没有意义,但是拥有堆上的资源也可以被视为对象的一部分。
【问题讨论】:
-
这与
const的应用有关。int &i() const上的const意味着i()不能修改调用它的对象的成员。它还允许为c调用c.i(),即const.. 但是,返回类型int &意味着c.i()返回一个非const对int的引用,所以底层int可以修改。为防止这种修改,请执行const int& i() const { return *ptr; } -
您将无法更改指针值。您将能够更改指针指向的值。你黑了自己。
标签: c++ function class constants member