2016-09-15 192 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 + +不會做。