为什么在这个函数定义的末尾附加了const?

时间:2014-02-20 06:32:51

标签: c++ 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的不同用途,超过了百万(我知道,在那里夸大了一点)。

3 个答案:

答案 0 :(得分: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 :(得分:1)

But why the appended const at the end of the function definition? 它是c ++语法,已定义为声明一个const函数,函数末尾的const表示此函数不会修改此对象的成员变量。

Isn't that to only have a pointer to a constant this, so you cannot modify class member variables? 每次调用成员函数时,编译器都会在堆栈中推送this参数,您不会在参数列表中声明此变量,因此您可以将其设为const,因此这是执行此操作的方法。

So what purpose does that serve if our function isn't trying to modify any member/object variables? 如果您确定您的函数不会更改成员变量,则可以创建函数const,因为在将来对函数进行任何更改(可能不是您)时,它会确认该函数更改函数不会更改成员变量,如果更改,则可以在编译时捕获。

答案 2 :(得分: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