С++ Разница между константным позиционированием

Я изо всех сил пытаюсь разобраться в различиях между различными местами, которые вы можете поставить "const" в объявлении функции в С++.

В чем разница между константой в начале:

const int MyClass::showName(string id){
...
}

И const в конце вроде:

int MyClass::showName(string id) const{
...
}

Кроме того, что является результатом наличия const как в начале, так и в конце так:

const int MyClass::showName(string id) const{
...
}
+6
источник поделиться
4 ответа

const int MyClass::showName(string id) возвращает объект const int. Таким образом, вызывающий код не может изменить возвращенный int. Если вызывающий код похож на const int a = m.showName("id"); a = 10;, то он будет помечен как ошибка компилятора. Однако, как отмечено @David Heffernan ниже, поскольку целое число возвращается копией, вызывающий код не обязан использовать const int. Он может очень хорошо объявить int как возвращаемый тип и изменить его. Поскольку объект возвращается копией, не имеет смысла объявлять возвращаемый тип как const int.

int MyClass::showName(string id) const указывает, что метод showName является функцией-членом const. Функция-член const является той, которая не изменяет никаких переменных-членов класса (если они не помечены как mutable). Поэтому, если у вас есть переменная-член int m_a в классе MyClass, и если вы попытаетесь выполнить m_a = 10; внутри showName, вы получите ошибку компилятора.

В-третьих, это комбинация двух вышеупомянутых случаев.

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

Нет никакого взаимодействия между этими двумя применениями const - они полностью независимые конструкции

+10
источник

Отличие состоит в том, что const применяется к различным вещам.

Это говорит о том, что showName возвращает константное значение int - неизменяемое. Конечно, поскольку int возвращается по значению, присутствие const здесь не играет никакой роли.

const int MyClass::showName(string id)

И это говорит о том, что showName не изменяет наблюдаемое состояние MyClass (технически: он не изменяет ни одного члена, который не объявлен mutable), и поэтому вам разрешено вызывать его по значению типа const MyClass.

int MyClass::showName(string id) const

Если вы используете оба const, то применяются оба вышеперечисленных.

+4
источник

Подобные вопросы, как правило, усиливают мою решимость следовать совету Дэна Сакса, изложенному в этой статье "Беседы с Гуру": http://www.drdobbs.com/conversationsa-midsummer-nights-madness/184403835.

В частности, речь идет о том, как размещение const меняет ситуацию. (*) Я понимаю, что я вряд ли переведу кого-нибудь из написания const int ... в int const ..., но это говорит о том, что я предпочитаю делать последние.

(*), в котором указывается, что замена константы с объявлением типа в самом начале - это одно изменение, которое не имеет эффекта.

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

Рассмотрим объявление типа:

int const * * const pointerToPointer;

В первом const указано, что целые числа в конце цепочки указателей являются константами, и их можно найти в * * const pointerToPointer. Между тем второй указывает, что объект типа указатель на указатель на const int также const и что этот объект pointerToPointer.

В случае OP:

int const MyClass::showName(string id){
...
}

Тип const - это int, а const - возвращаемое значение из функции.

Тем:

int MyClass::showName(string id) const {
...
}

Здесь тип const - это функция (string), возвращающая int, а const - сама функция, т.е. тело функции.

0
источник

Посмотрите другие вопросы по меткам или Задайте вопрос