2011-03-10 25 views
5

我遇到了一種與我目前對C++中方法的理解相沖突的情況。C++中的方法返回類型和修飾符的順序很重要嗎?

我正在通過Ivor Horton的「Beginning Visual C++ 2010」(Wrox Press)工作。

double Volume() const { 
    return m_Length * m_Width * m_Height; 
} 

我已經重新安排了改性劑:在449頁中的示例8_03,一個方法被定義

double **const** Volume() { 
    return m_Length * m_Width * m_Height; 
} 

從我的C#和Java的背景,我曾預計常量的位置是無關緊要,但在彙編時我收到了錯誤:

error C2662: 'CBox::Volume' : cannot convert 'this' pointer from 
      'const CBox' to 'CBox &' 

當我將訂單返回給Ivor時,錯誤消失。

這個順序實際上是否有所作爲,這不是一些奇特的錯誤?如果訂單確實重要,那麼人們如何記住正確的立場?

謝謝,

斯科特

回答

9

const被放置在構件方法的名稱後,即,指出this指針是什麼是恆定的。也就是說,原始聲明指出方法CBox::Volume()不會更改調用它的對象CBox

誤差的最可能的來源是,CBox::Volume()函數被調用上的const CBox,或內部的CBox的另一const方法。

+0

啊,是的!這就是它 - 編譯器對此和const感到不安。因此,將const附加到方法末尾的事實只是一個標準規則...... const在結束時意味着這是常量?我猜Java/C#的寬鬆世界太寬容了:) – 2011-03-10 22:45:37

+0

@Scott:Java不是太寬容,但它沒有類型限定符。當使用'const'時,重要的是你正在修改'int const *'的哪一部分與'int * const'不一樣,因爲const_ness適用於不同的事物。同樣,成員函數聲明中'const'的位置也是有意義的。注意,「成員函數」 - 如果你不斷地調用它們的方法,你會不自覺地將C++看作是Java的另一種帽子,它不是:-) – 2011-03-11 00:04:59

2

在這種情況下,成員函數名稱後面的const意味着該函數本身是const - 基本上,這意味着您無法修改成員函數中的對象。成員函數之前的const表示返回類型爲const。 (雖然它可以變得複雜的返回類型,我不想在這裏進入:))

1

是的順序是重要的。

在C++中,const關鍵字的位置將影響什麼項目是「const」。使用const關鍵字的範圍也是一樣。

2

編輯爲了更加簡潔。

const在這兩種情況下是非常不同的。

double Volume() const { 
    return m_Length * m_Width * m_Height; 
} 

這當對象的實例化是const,並返回一個double被調用。如果您嘗試使用非const實例調用該方法,則不會進行編譯。

const myClass obj; 
double d = obj.volume(); 
myClass obj2; 
double d = obj2.volume(); // This Fails to compile 

在另一方面...

double const Volume() { 
    return m_Length * m_Width * m_Height; 
} 

被調用時的對象不是const或者以前的定義不存在。

myClass obj; 
const double d = obj.volume(); 
const myClass obj2; 
const double d = obj2.volume(); 

(我應該提到,因爲我是以下提醒,返回一個const內置的類型,如double它並不真正意味着什麼。)

當你這兩個聲明的合適的一個將根據實例是否爲const來調用。

myClass obj; 
const double d = obj.volume(); // This calls `const double volume()` 
const myClass obj2; 
double d = obj2.volume(); // This calls 'double volume() const` 
+0

你最後的片段可能有點誤導。返回值可以存儲在一個非常量「double」中,並隨後進行更改。 [將內置類型作爲'const'返回沒有效果。](http://stackoverflow.com/questions/1443659/should-i-return-bool-or-const-bool) – Troubadour 2011-03-10 22:04:40

+0

是啊...你知道,事後我想到了這一點。使用內置式,它不會被切割和乾燥。我會編輯以反映這一點。 – 2011-03-10 22:09:15

+0

這給人一種有點錯誤的印象,即'obj'必須是const來調用第一個,並且結果必須在第二種情況下分配給const double。 http://ideone.com/6hBWH(第二種情況實際上應該是毫無意義的--G ++甚至警告說,返回類型會忽略頂層const限定符。) – UncleBens 2011-03-10 22:10:39

2

方法名稱後的const告訴該方法將不修改任何數據成員(mutable成員是一個例外)的編譯器。

const之前的方法名稱適用於返回值。這告訴編譯器該方法返回常量數據。返回類型的const主要用於引用和指針。

+0

謝謝Thomas!這有助於。 – 2011-03-10 22:47:00

相關問題