Возвращение постоянного символьного указателя из функции
Есть ли
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
доступен без оговорок в неглобальном пространстве имен, где находится это определение (что является моим предпочтением).
Это означает, что getName()
возвращает постоянный указатель на постоянный символ, и он не будет изменять никаких неизменяемых членов класса внутри тела функции.
Обратите внимание, что члены класса, объявленные как изменяемые, все еще могут быть изменены в этой функции.