Наткнувшись на следующий фрагмент кода:
class Person
{
private:
char name[10];
public:
// this won't compile:
char* getName_1() const {
return name;
}
// this will:
const char* getName_2() const {
return name;
}
};
Мне интересно, как именно компилятор может сказать, что getName_1() не является константной функцией. Потому что внутри тела функции нет фрагмента кода, который фактически изменяет переменную-член.
Что вы подразумеваете под компилятором, говорящим или не говорящим? Вопрос неясен. Возможно, вы захотите посетить эту страницу? stackoverflow.com/help/как спросить
@NathanOliver Правильно, но нет фрагмента кода, который пытается изменить массив name - возвращается только его адрес. До сих пор я думал, что в каждой const-функции каждый член рассматривается как const-член и, следовательно, не может быть изменен, но, очевидно, это еще не все...
char* в качестве возвращаемого типа для getName_1. Вы не можете этого сделать, потому что в константной функции name является const char[], а не char[].
Понятно. Просто потому, что преобразование из const char* в char* не допускается.
Правильный. Вы не можете неявно отказаться от const, и это хорошо.





Поскольку getName_1 помечен как const, все поля этого класса рассматриваются как константы.
Итак, тип name в getName_1 — это const char[10].
Его нельзя неявно преобразовать в char * (тип возвращаемого значения), поэтому компилятор сообщает об ошибке.
getName_1()является является константным методом, так как он буквально помечен как const в своем объявлении. Это означает, что его неявный указатель this равен const, поэтому член name обрабатывается как const, и поэтому getName_1() не может вернуть указатель непостоянный на данные константа, поэтому он не будет компилироваться.
В дополнение к другим (правильным) ответам это компилируется:
class Person
{
private:
char* name;
public:
// this compiles:
char* getName_1() const {
return name;
}
};
Более всего это показывает, что вопреки популярному мифу массив в C++ — это нет указатель.
Не могли бы вы расширить?! Звучит интересно, но я не совсем понимаю причину.
Здесь нет особых рассуждений. Модификатор const в функции-члене рассматривает все члены как const, поэтому name становится char* const name. Ничто не мешает вам создать еще один неконстантный указатель и присвоить ему значение константного указателя name.
Я не понимаю вопроса.
getName_1()являетсяconstфункция.