Что вы испытываете - это ожидаемое поведение. Когда вы объявляете функцию const
, вы эффективно говорите: «Эта функция не будет изменять переменные-члены класса». Таким образом, все переменные-члены для такой функции выглядят как const
. GCC подчеркивает это в сообщении об ошибке:
x.cpp: In member function ‘char* Student::get_fName() const’:
x.cpp:11:12: error: invalid conversion from ‘const char*’ to ‘char*’ [-fpermissive]
return _fName;
^
Это потому, что, к const
функции, _fName
, как представляется const char[20]
. Преобразование в char[20]
, которое может быть изменено, запрещено, если вы не используете листинг C-стиля или const_cast
. Когда вы не объявляете функцию const
, _fName
представляется char[20]
, который неявно конвертируется в char*
, и функция работает без кастинга.
Однако это не должно быть сделано: если вам нужна функция для изменения внутренних объектов объекта, просто не объявляйте ее const
, так как она нарушает контракт, который вы указываете, что функция выполняет.
В другом примечании рассмотрите возможность использования std::string
для хранения строк в вашей программе.
но я не изменяю его, нет никаких изменений, я возвращаю строку только. – leonid1990
Возвращая 'char *', вы разрешаете вызывающему 'get_fName()' изменять строку. Больше нет 'const'. –
Я хочу прокомментировать, но я не знаю, как распечатать новую строку здесь, даже после получения справки – leonid1990