2014-01-06 70 views
0

我剛剛開始閱讀關於C++中的模板類,並且遇到了一些我不知道的語法。 類方法的原型爲:C++模板類中的'const'方法

template <class Type> class Range { 
      .... 
     bool Below (const Type& value) const; 
      .... 
} 

,並定義爲:

template <class Type> bool Range<Type>::Below(const Type& Value) const { 

    if (Value < Lo) return true; 
    return false; 
} 

誰能幫助我理解了「常量」標誌意義的方法輸入已上市之後? 我明白那裏使用時,輸入前,但不是之後。 乾杯, 傑克

+1

與模板無關。在構建[testcase](http://sscce.org)時,你會發現這只是成員函數的一個特性。 –

+0

const有時會令人困惑,除非你知道你爲什麼使用它。除了這裏的好答案,請閱讀防禦性編程,[const-correctness](http://stackoverflow.com/questions/136880/sell-me-on-const-correctness) – mungflesh

回答

8

const成員函數頂層 const限定符被施加到類的每個成員,除非構件被標記爲mutable(這意味着從未const)。

您還可以有volatile成員函數和volatileconst

注意,對於指針和引用的行爲可能會令人吃驚:

struct X { 
    int a; 
    int* pa; 
    int& ra; 
    X() 
     : a(1) 
     , pa(&a) 
     , ra(a) 
    {} 

    void foo() const { 
     *pa = 2; // Ok, this is the pointer being const, not the value being pointed to. 
     ra = 3; // Ok, this is the reference being const, not the value being referenced. 
     a = 4; // Error, a is const 
     pa = &a; // Error, pa is const. 
    } 
}; 

下面是頂級const預選賽中如何應用:

  • int成爲int const - 恆定的整數。
  • int*變成int* const - 一個常量指針,而不是int const* - 指向常量的指針。
  • int&變成int& const - 常數引用,而不是int const& - 對常量的引用。將const應用於引用不會執行任何操作,因爲無論如何它們都無法更改爲引用另一個對象。

的另一種方式考慮這一點,是在非const成員函數this具有X* const的類型,而在const成員函數thisX const* const。注意如何this指針始終是不變的。

2

一個方法後的const意味着該方法本身是常量,並且實際上會有一個常量'this'指針。在基本術語中,它表示該方法不允許更改類的狀態(成員變量)。這允許編譯器優化這個事實,並告訴其他開發人員該方法不會進行狀態更改。

有很多方法可以在C++中繞過這個規則,比如'mutable'關鍵字和const_cast,但是除非你真的知道你在做什麼,否則你不應該試圖破壞const的正確性。

+0

我不確定是否編譯器被允許進行優化,因爲我們被允許有'可變'成員。 – leemes

+0

編譯器會進行優化,除非使用'mutable'。編譯器足夠聰明,可以知道類何時有可變成員,什麼時候不可以。相信我,編譯器會針對const方法進行優化。 –

2

這意味着該方法是const。該方法不能改變它被調用的對象的狀態。如果你在這個方法中改變變量,你會得到一個編譯器錯誤。

只有聲明const的方法可以在const對象上調用,因爲它們保證不會改變它。

1

編譯器隱式地將指向該對象的指針作爲非靜態成員的參數傳遞。它在函數定義中被命名爲this。限定符const表示該指針this具有限定符const。這是它應用於指針this

+0

而這會使指針'this'爲常量(即'X * const'),而不是指向的值。請注意,'this'總是const,你不能重新分配它。我最喜歡的面試問題是'typedef char * P; typedef const P Q; typedef P const V',什麼是'Q'和'V'? –

+0

@Maxim Yegorushkin也許我的描述不清楚,但我的意思是const SomeClass *。 –

+0

編譯器在右側應用cv-qualifiers,事實上,你所說的是'SomeClass * const'。這就是有些人寫'int const'而不是混淆const const的原因。 –