以下代码
#include <iostream>
class A
{
public:
int x;
double y;
A(int x_, double y_) : x(x_), y(y_)
{
}
void display(void) const;
};
class B
{
public:
static A staticObject;
};
void A::display(void) const
{
std::cout << x << ' ' << y << std::endl;
B::staticObject.x = 42;
B::staticObject.y = 3.5;
std::cout << x << ' ' << y << std::endl;
}
A B::staticObject(19, 29.3);
int main(void)
{
B::staticObject.display();
return 0;
}
打印出来
19 29.3
42 3.5
这让我想知道:
让const成员函数通过其他方法修改它所调用的对象是否总是安全的?
此外,如果该成员函数(此处display
)未被声明为const
,是否存在可以防止的最坏情况?
答案 0 :(得分:0)
您的代码有效且有效,因为display()
为const
,但仅限于其包含的类A
。这对其修改以另一种方式访问的字段的能力没有影响 - 在您的情况下,通过非const公共访问这两个字段。
但是,这段代码非常可怕。
答案 1 :(得分:0)
您认为&#34;安全&#34;?
你应该对const成员函数做出的唯一假设是它不会修改它所在的当前对象(this
指针)。虽然constness不是运行时强制执行但在编译期间。
所以当你&#34;欺骗&#34;您的编译器在静态变量的帮助下无法检测到您实际访问的是同一个实例。 B中的staticObject
也可以指向另一个A而不是它被调用的A.
为了能够检查它,需要运行时检查,而c ++不会这样做。