Какой из них использовать const char [] или const std :: string? - PullRequest
5 голосов
/ 20 января 2010

Что лучше для строковых литералов, стандартная строка или массив символов?

Я имею в виду, для постоянных строк, скажем,

const char name[] = "so"; //or to use 
const string name = "so";

Ответы [ 4 ]

8 голосов
/ 20 января 2010

Для строковых литералов и только для строковых констант, которые приходят из литералов, я бы использовал const char[].Основным преимуществом std::string является то, что он имеет бесплатное управление памятью, но это не проблема со строковыми литералами.

В любом случае, это фактический тип литерала, и его можно напрямую использовать в любомAPI, который требует либо строки с нулевым символом в конце старого стиля C, либо строк C ++ (включается неявное преобразование).Вы также получаете реализацию размера времени компиляции, используя массив вместо указателя.

Теперь, когда определяются интерфейсы функций, и даже если предполагается передавать константы, я бы предпочел std::string, а не const char*, так как в последнем случае размер теряется, и, возможно, потребуется его пересчет.

Исходя из моего собственного опыта.Я состарился, когда писал .c_str() при каждом обращении к библиотеке журналов (в которой использовались переменные аргументы) для литеральных строк с сообщениями об информации / ошибках.

2 голосов
/ 20 января 2010

Что ты с этим делаешь?Чего ожидают ваши методы?

const char легче в хранилище, но не имеет мощности std :: string или безопасности при его использовании.Однако, если у вас много C API, это может быть более разумный выбор.

std :: string будет предпочтительным вариантом.

2 голосов
/ 20 января 2010

Вы должны использовать то, что вам больше подходит.Если бы не было особых требований, я бы использовал std::string, потому что он выполняет всю работу с памятью.

Для строковых литералов я бы использовал const char*.Причина против const char[] в том, что вы можете использовать const char* для инициализации другой константы.Проверьте следующий код:

const char str1[] = "str1";
const char* str11 = "str11";

const char str2[] = str1;    // <<< compile error
const char* str22 = str11;   // <<< OK

Строковые литералы имеют статическую длительность хранения (согласно 2.13.4 / 2), поэтому указатель const char* будет действителен до завершения программы.

1 голос
/ 20 января 2010

Я предпочитаю const std::string более const char * для строковых литералов. Поскольку передача строковых литералов в функции, принимающие const std::string &, будет тихо создавать строку каждый раз, когда они вызываются, вместо одного. Однако, если я в основном использую литерал с функциями, ожидающими const char *, я буду использовать это вместо.

Я склоняюсь к std::string за apis.

Конечно, если я использую Unicode, я использую std::wstring и wchar_t.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...