Как указано в бронировании, я читаю:
"Чтобы иметь возможность ссылаться на 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;
}
~~~~~~~~~~
Будучи новичком в этом языке, я все еще получаю миллион (я знаю, преувеличивая там) различные применения const
на языке C++.
Есть одна заметная разница. const
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();
}
Вы должны считать 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
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
, потому что в случае, если в будущем будут внесены какие-либо изменения в функцию (может быть, не вы), она подтверждает, что человек, изменяющий функцию, не меняйте переменные-члены, если они меняются, их можно поймать во время компиляции.
const
правильности. Вы не можете вызвать неконстантную перегрузку для экземпляраconst
(или с помощью ссылки наconst
или указателя наconst
.)