#c
#c
Вопрос:
Есть ли разница или это просто вопрос предпочтений? Я новичок в c , и меня беспокоит, что я не уверен, что выбираю правильный способ инициализации строкового значения.
Если бы я просто выбрал один способ, который работает для подавляющего большинства вариантов использования, какой бы это был?
// Initializing from a literal.
std::string s1{"hello"};
std::string s2("there");
std::string s3 = {"what"};
std::string s4 = "is";
// Initializing from another string object.
std::string s5{s1};
std::string s6(s1);
std::string s7 = s1;
std::string s8 = {s1};
PS: Прошу прощения, если этот вопрос во всей его полноте задавался ранее, я нигде не мог его найти и был бы признателен, если бы кто-нибудь мог дать на него ссылку здесь.
Комментарии:
1. Я рекомендую изменить формулировку вашего вопроса, чтобы спросить об общих технических различиях между этими различными способами инициализации строки, поскольку запрос «правильного способа» может быть закрыт как не относящийся к теме (в основном основанный на мнении).
2. Я ожидаю, что современные компиляторы C будут генерировать идентичный код для всех логически эквивалентных альтернатив. Так что это чисто вопрос личного мнения и предпочтений.
3. @MaxVollmer — Хороший вызов — немного отредактировал вопрос.
4. @SamVarshavchik — Спасибо, не могли бы вы констатировать это как факт, что все компиляторы будут рассматривать их как эквивалентные? Или существуют определенные ситуации, когда одно предпочтительнее другого? Немного странно, что c допускает так много способов инициализации строки, за этим должны быть какие-то причины, кроме обратной совместимости?
Ответ №1:
В частности, для строк вы всегда сможете использовать все вышеперечисленное, и это действительно просто вопрос личных предпочтений.
Я лично предпочитаю
auto s1 = std::string(); //Initialize empty string
auto s2 = std::string("Hello, world"); // Initialize string containing "Hello, world"
auto s3 = s2; //Make a copy of s2
auto s4 = std::move(s3); //Move s3 into s4
И причина, по которой я предпочитаю это, заключается в том, что это работает со всеми типами. Вы не можете забыть инициализировать что-либо, если используете auto:
int i; //Oops, forgot to initialize i, because i is a primitive
Против:
auto i = 0; //i set to 0
auto i2 = size_t(0); //i2 is a size, and set to 0
auto i3; //Error: forgot to initialize
Важно сохранять согласованность во всей кодовой базе.