2014-02-20 50 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 
相关问题