Почему в конце определения этой функции добавлен const? [Дубликат]

0

Как указано в бронировании, я читаю:

"Чтобы иметь возможность ссылаться на 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++.

  • 0
    @juanchopanza ты мой герой.
  • 0
    Это обеспечивает соблюдение const правильности. Вы не можете вызвать неконстантную перегрузку для экземпляра const (или с помощью ссылки на const или указателя на const .)
Теги:
const

3 ответа

2
Лучший ответ

Есть одна заметная разница. 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();
}
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
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, потому что в случае, если в будущем будут внесены какие-либо изменения в функцию (может быть, не вы), она подтверждает, что человек, изменяющий функцию, не меняйте переменные-члены, если они меняются, их можно поймать во время компиляции.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню