2014-02-20 82 views
0

正如預訂說我讀:爲什麼在此函數定義的末尾添加了const?

「爲了能夠調用get()還,如果我們只有一個指針或引用const TextureHolder在眼前,我們需要提供一個const合格超負荷這種新的成員函數返回一個const sf::Texture的引用,因此調用者不能改變紋理......「

然後筆者進入到提供重載函數定義的這個例子:

const sf::Texture& TextureHolder::get(...) const;

據我所知,如果您有參考或指向const TextureHolder的指針,則無法對其進行修改。因此返回類型爲const sf::Texture&

但是爲什麼在函數定義的末尾加了const?是不是隻有一個指向常量this的指針,所以你不能修改類成員變量?那麼,如果我們的函數不試圖修改任何成員/對象變量,那麼它的用途是什麼?

對於好奇,這裏是全功能:

sf::Texture& TextureHolder::get(Textures::ID id){ 
    auto found = mTextureMap.find(id); 
    return *found->second; 
} 

~~~~~~~~~~

作爲新的語言,我仍然得到超過百萬(我知道,在那裏誇大了一點)在C++語言中const的不同用途。

+0

@juanchopanza你是我的英雄。 – WhozCraig

+0

它強制'const'正確。你不能在一個'const'實例上(或者通過一個'const'引用或者一個指向'const'的指針)調用一個非const超載。 – juanchopanza

回答

2

有一個顯着的區別。 const實例將調用const過載,反之亦然。

class T 
{ 
public: 
    int get() const 
    { 
     std::cout << "const.\n"; 
     return 42; 
    } 

    int get() 
    { 
     std::cout << "non-const.\n"; 
     return 42; 
    } 
}; 

int main() 
{ 
    const T c; 
    T t; 
    auto i = c.get(); 
    auto j = t.get(); 
} 
1

But why the appended const at the end of the function definition? 它是已被定義在的功能的端聲明一個const函數,常量說,該功能不會修改和此對象的成員變量的C++語法。

Isn't that to only have a pointer to a constant this, so you cannot modify class member variables? 每當一個成員函數稱爲this參數是由編譯器壓入堆棧,你是不是聲明在參數列表這個變量,這樣就可以使它常量,所以這是應該做的方式它。

So what purpose does that serve if our function isn't trying to modify any member/object variables? 如果你確信你的功能不會改變成員變量可以使功能const,因爲在未來的任何變化對該函數的情況下(可以通過你是不是),就已經證實更改函數的人不會更改成員變量,如果更改,它可以在編譯時捕獲。

1

您應該考慮將this作爲傳遞給成員函數的附加參數。成員函數末尾的const表示參數可以是const限定的。沒有const限定的超載,您不能在const對象上調用成員函數。在過載分辨率選擇適當的成員:

sf::Texture  t = ...; 
sf::Texture const ct = ...; 

t.get(); // calls sf::Texture::get() 
ct.get(); // calls sf::Texture::get() const 
相關問題