Что означает константа в конце функции-члена? [дубликат]


этот вопрос уже есть ответ здесь:

  • Значение 'const' last в объявлении функции класса? 7 ответов

что именно const ключевое слово в C++ означает, когда это написано в конце функции-члена (после списка аргументов)?

3 60

3 ответа:

это означает, что *this и const внутри этой функции-члена, т. е. она не изменяет объект.

ключевое слово this - это выражение prvalue, значением которого является адрес объекта, для которого вызывается функция. Тип this в функции-члене класса X и X*. Если функция-член объявлена const, типа this и const X*. [раздел §9.3.2 1]

на const функции-члена объекта для которой вызывается функция, доступ осуществляется через const путь доступа; следовательно, a const функция-член не должна изменять объект и его нестатические элементы данных. [раздел 9.3.2 §2]

это означает, что a const функция-член может быть вызвана на const экземпляр класса. А не -const функция-член не может быть вызвана на [1]a const объект, так как он потенциально может попытаться изменить оно.

[1] Примечание: временный не является const объект, если это не const тип.

const в конце сигнатуры функции означает, что функция должна принимать объект, членом которого она является const. На практике это означает, что вы просите компилятор Регистрация что функция-член никак не изменяет данные объекта. Это означает, что компилятор должен проверить, что он непосредственно не изменяет данные элемента, и он не вызывает никакой функции, которая сама по себе не гарантирует, что она не изменит объект.

когда вы создайте const объект вы просите компилятор убедиться, что этот объект не изменяется после его инициализации. Это, в свою очередь, означает, что компилятор будет проверять, что вы непосредственно не изменяете свои данные-члены и что вы не вызываете какую-либо функцию, которая не гарантирует, что она не изменит объект.

Это все часть const correctness философия. По сути, это означает, что если вещи работают прямо сейчас, и они не изменятся, то они никогда не сломаются. В другими словами, с постоянными вещами легче работать надежно. Это const вещь в конце сигнатур функций является инструментом для вас, чтобы запретить вещи от взлома. Это в свою очередь означает, что вы должны поставить const везде, где только можно.

оптимизация компилятора возможна, но основное преимущество заключается в применении контракта, выраженного в объявлении функции - если вы определяете функцию-член как const, компилятор предотвращает любые изменения объекта внутри этой функции.

вы можете освободить отдельные поля в классе от этого ограничения с помощью mutable в своем заявлении. Это полезно, например, когда у вас есть класс, который инкапсулирует свой собственный lock_guard, который должен изменить свое значение чтобы обеспечить потокобезопасность даже в пределах const функции-члены.