Ответ 1
Честно говоря, я бы просто сохранил функцию const char* text
и добавил функцию перегрузки const std::string& text
, которая вызывает первый с setText(text.c_str())
Внутри С++ обычно передается по ссылке вместо указателя, если значение не может быть NULL.
Предположим, что у меня есть функция со следующей сигнатурой, которая часто используется со строковым литералом.
void setText( const char* text );
Мне было интересно, как я могу изменить функцию таким образом, чтобы она принимала ссылку (и имеет ли преимущество не принимать NULL)?
Если бы я изменил его на (const char& text)
, тогда это будет ссылка на один char. Из которого адрес может быть принят внутри функции... но чувствует себя не очень хорошо.
Другим вариантом будет (const std::string& text)
, который имеет тот недостаток, что он всегда вызывает конструктор и выполняет некоторое динамическое распределение памяти.
Любые другие общие способы или просто придерживайтесь std::string&
или char*
?
Честно говоря, я бы просто сохранил функцию const char* text
и добавил функцию перегрузки const std::string& text
, которая вызывает первый с setText(text.c_str())
Здесь небольшая проблема в том, что С++ и reference-to-arrays не лучшая пара. Для справки см. С++ передайте массив по ссылке
Поскольку вы говорите о привязке ссылки к строке, а строка представляет собой массив символов, мы сталкиваемся с этой проблемой. В свете этого самое лучшее, что мы можем сделать, это привязать ref к const char *, который выглядит следующим образом:
void ref(const char* const& s);
Но это не делает то, что вы хотите; это связывает ссылку с указателем, и все это гарантирует, что сам указатель существует, а не указывает на допустимый строковый литерал. Эта же проблема присутствует в std::string & примеры: это гарантирует, что вы привязаны к объекту std::string, но эта строка может быть пустым, поэтому вы все еще не гарантировали себя строкой, которая имеет что-то полезное.
В конце концов, я повторю то, что говорит Зан. const char * - хорошо уважаемая идиома, передающая строковые литералы, а затем наличие второй перегрузки, которая привязывается к строкам, является приятным удобством.
(последнее примечание: std::string не "всегда" выделяет память. Реализации с небольшой оптимизацией строк будут пропускать его для строк длиной до 23 символов.)