正如预订中所述,我正在阅读:
“为了能够调用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 :(得分: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