Есть ли
const char * const getName () const
{
return name ;
}
Значит это getName()
возвращает постоянный указатель на постоянный символ? Поскольку функция постоянна, она не будет изменять ни один из своих аргументов.
Ваш пример,
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
доступен без оговорок в неглобальном пространстве имен, где находится это определение (что является моим предпочтением).
Это означает, что getName()
возвращает постоянный указатель на постоянный символ, и он не будет изменять никаких неизменяемых членов класса внутри тела функции.
Обратите внимание, что члены класса объявлены как изменчивый может быть еще изменен в этой функции.