2015-07-01 4 views
-1

Может ли кто-нибудь объяснить мне, почему, если я делаю функцию get_fName функцией const, она возвращает _fName только при кастинге (char *)? Без кастинга он не компилируется. С другой стороны, если я удаляю const, он возвращает _fName также без каста?Функция const не возвращает char *

class Student 
{ 
    int _id; 
    char _fName [20]; 
     char* get_fName() const; 
} 
// implementation 
    char* Student::get_fName() const 
{ 
    return (char*)_fName; 
} 

ответ

0

Что вы испытываете - это ожидаемое поведение. Когда вы объявляете функцию 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 для хранения строк в вашей программе.

+0

но я не изменяю его, нет никаких изменений, я возвращаю строку только. – leonid1990

+0

Возвращая 'char *', вы разрешаете вызывающему 'get_fName()' изменять строку. Больше нет 'const'. –

+0

Я хочу прокомментировать, но я не знаю, как распечатать новую строку здесь, даже после получения справки – leonid1990

Смежные вопросы