2011-05-10 56 views
13

可能重複:
Why isn't the const qualifier working on pointer members on const objects?爲什麼C++不對指針數據強制執行const?

考慮具有指針構件int *a下面的類。編譯器允許const方法constMod,即使它修改指針數據。爲什麼編譯器不會在const方法的上下文中使指針數據爲常量?如果a只是一個int,我們不會允許在const方法中修改它。

class ConstTest 
{ 
    public: 

    ConstTest(int *p): a(p) {} 

    void constMod() const { 
     ++(*a); 
    } 

    int *a; 
}; 

我在linux上使用g ++。

+0

唯一的答案就是「因爲是這樣的」,但我想我們大多數人同意它通常是意外(起初),儘管人們可以事後找理由。 – 2011-05-10 06:33:23

+0

C++默認給出了一個所謂的二進制位常量性 - 這意味着它可以確保對象的無單位已經改變,所以它只是檢查指針 – rank1 2014-04-30 16:02:52

回答

4

這只是一個所有權問題......編譯器無法知道所指向的對象是否在邏輯上是對象的一部分,因此它讓程序員來監視這些問題。 const成員被允許執行帶有副作用的操作,只要他們不修改自己的表觀值。與讓他們打電話說std::cout::operator<<()或其他一些非const函數沒什麼兩樣。

13

constMod()a聲明作爲處理:

int *const a; 

這意味着指針具有恆定值,而不是什麼。這聽起來像你期望它被作爲治療:

const int *a; 

這是不同的。

+1

的地址是沒有回答它沒有澄清的問題...? – 2011-05-10 05:27:35

+0

那爲什麼呢?爲什麼不在const方法中強制執行const的所有內容?看起來奇怪的是將指針數據視爲副作用。 – MattSmith 2011-05-10 05:42:32

+0

@Matt:C++就是這樣。想象一下,它是一個整數而不是一個指針,你不能改變整數。這個整數意味着你*與它的價值無關。 (這可能是一個計數器,年齡等)。同樣,一個指針值無關,與它指向的(我們只是碰巧同意,指針值指示的地址,所有的時間,而不是像各種各樣的東西一個整數可以;但類比仍然成立)。對於它的價值,D語言的行爲就像你期望的那樣。 – GManNickG 2011-05-10 06:03:43

7

指針本身沒有修改,只有數據指出。即使從人的角度來看這聽起來很奇怪,但從編譯器的角度來看,這個類的成員都不會被改變。

0

在上述情況下const是什麼,指針本身。你不能做++a;。但是,它並不妨礙您修改指向的數據

0

我相信因爲在這裏你試圖改變datamember指向的值。 如果您嘗試修改數據成員,則會出錯。

意義,因此當你做點別的東西,而不是改變值

0

const成員函數不會允許你修改它的成員得到錯誤。

在你的例子中,你有一個指向int的指針。

而在const方法中,您正在修改它指向的值,但不修改指針本身。

嘗試給予,++a,它實際上會修改指針值,並且不會在您的const方法中被允許。

0

考慮

const T immutable_object0; 
const T immutable_object1; 
const T* mutable_view = ...a condition... ? &immutable_object0 : &immutable_object1; 
// then later you reseat 
mutable_view = ...another condition... ? &immutable_object0 : &immutable_object1; 

const int immutable_data[120] 
const int* mutable_view = immutable_data; 
for(const int* end = immutable_data + 120; mutable_view != end; ++mutable_view) { 
    // can't modify *mutable_view 
} 

這是因爲指針並不總是有所有權。在某些情況下,指針是一個對象的視圖(第一個例子),或者是迭代器到一個原始數組(第二個例子)。對於這些情況,僅僅因爲指向的數據是不可變的(或者看作不可變的),限制指針上可用的操作是沒有意義的。

第一個例子是有點做作,但它的一個有效的版本是,當你使用指針成員來實現對象關聯,你不想基準部件的麻煩。有時指向的類型恰好是const

相關問題