2016-09-15 133 views
0

变量下面的代码全局变量修改的const成员函数,其中通过全局函数

#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

const成员函数只适用于对象的当前实例。所以当你得到同一个对象的非const实例时,你可以在那里调用非const函数。 const关键字只会使'this'->指针成为常量。 – Hayt

+0

这种设计的背景是什么? – wasthishelpful

回答

0

由于display()const,因此您的验证码是有效的,但仅适用于其包含的类A。这不会影响其修改以另一种方式访问​​的字段的能力 - 在您的情况下,通过非const公共访问这两个字段。

但是,这段代码是可怕的和可怕的。

0

你认为“安全”是什么?

你应该对const成员函数做的唯一假设是它不会修改它所在的当前对象(this指针)。虽然Constness不是运行时强制的,但是在编译期间。

所以,当你借助静态变量“欺骗”你的编译器时,它不能检测到你实际上正在访问同一个实例。 B中的staticObject也可以指向另一个A,而不是它被调用的那个。

为了能够检查它将需要运行时检查哪些c + +不会做。