Возвращение постоянного символьного указателя из функции

Есть ли

const char * const getName () const
{
return name ;
}

Значит это getName() возвращает постоянный указатель на постоянный символ? Поскольку функция постоянна, она не будет изменять ни один из своих аргументов.

2

Решение

Ваш пример,

const char * const getName() const { return name; }

скорее всего возвращает постоянный указатель на постоянный нулевой символ строка (то есть до первого символа в такой строке). Технически это просто указатель на char, Но такие указатели обрабатываются как указатели на нулевые строки, например cout,

Поскольку метод объявлен const он не может напрямую изменять обычныеmutable члены, но это может изменить данные, на которые указывают члены, которые являются указателями. Это означает, что технически это Можно изменить вещи, которые рассматриваются как части объекта, к которому он обращен, если эти вещи объявлены mutable или на которые указывают указатели. Тем не менее, общее условность для const Метод заключается в том, что, даже если он выполняет некоторые внутренние изменения, такие как обновление кэша, он не изменит внешне видимого состояния объекта, то есть, с точки зрения внешнего вида, он не изменит объект.

Для C ++

  • Предпочтительно использовать строковый класс, такой как std::string, в частности, чтобы избежать проблем с управлением временем жизни динамически выделяемой памяти.

  • Не использовать get префиксы, так как в C ++ они только добавляют больше для чтения (например, вы бы написали getSin(x)*getCos(x)?). В общем, назовите такие вещи, чтобы призвание код читается как английская проза! 🙂 Вы можете посмотреть на это как на дизайн немного языка.

  • Как правило, не добавляйте const на верхнем уровне возвращаемого значения, так как это предотвращает оптимизацию перемещения.

Кроме того, обычно используется соглашение об именах членов, такое как name_ (обратите внимание, что подчеркивание на конец, не в фронт, чтобы избежать конфликта с соглашением об именовании C) или myName,

Таким образом, обычная в C ++ эта функция будет закодирована как

string name() const { return name_; }

при условии, что string доступен без оговорок в неглобальном пространстве имен, где находится это определение (что является моим предпочтением).

3

Другие решения

Это означает, что getName() возвращает постоянный указатель на постоянный символ, и он не будет изменять никаких неизменяемых членов класса внутри тела функции.
Обратите внимание, что члены класса объявлены как изменчивый может быть еще изменен в этой функции.

4