Что означает константа в конце функции-члена? [дубликат]
этот вопрос уже есть ответ здесь:
- Значение 'const' last в объявлении функции класса? 7 ответов
что именно const
ключевое слово в C++ означает, когда это написано в конце функции-члена (после списка аргументов)?
3 ответа:
это означает, что
*this
иconst
внутри этой функции-члена, т. е. она не изменяет объект.ключевое слово
this
- это выражение prvalue, значением которого является адрес объекта, для которого вызывается функция. Типthis
в функции-члене классаX
иX*
. Если функция-член объявленаconst
, типаthis
иconst X*
. [раздел §9.3.2 1]на
const
функции-члена объекта для которой вызывается функция, доступ осуществляется черезconst
путь доступа; следовательно, aconst
функция-член не должна изменять объект и его нестатические элементы данных. [раздел 9.3.2 §2]это означает, что a
const
функция-член может быть вызвана наconst
экземпляр класса. А не -const
функция-член не может быть вызвана на [1]aconst
объект, так как он потенциально может попытаться изменить оно.[1] Примечание: временный не является
const
объект, если это неconst
тип.
const
в конце сигнатуры функции означает, что функция должна принимать объект, членом которого она являетсяconst
. На практике это означает, что вы просите компилятор Регистрация что функция-член никак не изменяет данные объекта. Это означает, что компилятор должен проверить, что он непосредственно не изменяет данные элемента, и он не вызывает никакой функции, которая сама по себе не гарантирует, что она не изменит объект.когда вы создайте
const
объект вы просите компилятор убедиться, что этот объект не изменяется после его инициализации. Это, в свою очередь, означает, что компилятор будет проверять, что вы непосредственно не изменяете свои данные-члены и что вы не вызываете какую-либо функцию, которая не гарантирует, что она не изменит объект.Это все часть const correctness философия. По сути, это означает, что если вещи работают прямо сейчас, и они не изменятся, то они никогда не сломаются. В другими словами, с постоянными вещами легче работать надежно. Это
const
вещь в конце сигнатур функций является инструментом для вас, чтобы запретить вещи от взлома. Это в свою очередь означает, что вы должны поставитьconst
везде, где только можно.
оптимизация компилятора возможна, но основное преимущество заключается в применении контракта, выраженного в объявлении функции - если вы определяете функцию-член как
const
, компилятор предотвращает любые изменения объекта внутри этой функции.вы можете освободить отдельные поля в классе от этого ограничения с помощью
mutable
в своем заявлении. Это полезно, например, когда у вас есть класс, который инкапсулирует свой собственный lock_guard, который должен изменить свое значение чтобы обеспечить потокобезопасность даже в пределахconst
функции-члены.