2013-04-01 30 views
2

我是C++的初學者,我有一個問題,我想確保...我已經在網上搜索過了。在C++中,做一個別名const

假設我有一個類調用A,它有一個名爲Afunction的函數。該函數的樣子:

// this is pseudocode 
void Afunction (const A& a) 
{ 
a.something = a.something +1; 
} 

我的理解是,我們有一個名爲「A」的「類指針」的事情,它是一個別名,無論我們在通過這裏我們只確保別名本身是常量,但。不保證它指向的價值不會改變。事實上,我正在改變它..而且我沒有得到任何錯誤。

所以我的問題是,我如何確保別名指向的值不能更改?如果它的指針不是別名,它會容易得多...

在此先感謝。

+1

該代碼不應編譯。 – Pubby

+3

如果'A :: something'是一個賦值運算符被重載並聲明爲'const'的類型,那麼代碼*可以*實際編譯。 (除非我錯過了某些東西) –

+6

如果A :: something是可變的,它也可以編譯。 –

回答

2

如果編譯器接受該代碼,則應該立即關閉它。您可以修改a

2

A const&(其unforunately相當於const A&)是參照const對象

同樣,A const*指針const對象,同時A * constconst指向對象的指針和A const * const是* const指針const object`。

關鍵是從右到左讀取(和寫入)您的類型聲明。

1

這一切都取決於什麼是something

如果您發佈了A類代碼,將更容易解釋爲什麼您可以更改something

一般來說,您不能修改const A&的內容。但是......

  • something可以是靜態的,那麼const不會因爲something關係在技術上不屬於a變量Afunction
  • something可以聲明爲mutable。有時候,即使對象是const,也可以改變成員變量是有益的。例如,引用計數。
  • something可能是完全不同的東西,奇怪的語義。 (正如Zyx 2000指出的那樣)。
+0

公開可變數據是很少見的。 –

+0

@juanchopanza這不是一個語法錯誤。 [自己檢查一下](http://ideone.com/b6f5sa)。 – milleniumbug

+0

@AlexChamberlain我同意這將是罕見的。但這是可能的。 – milleniumbug

相關問題