Инициализация строк как пустая строка или пустая строка
Как бы это важно, если мой код на С++ (как показано ниже) имеет строку, инициализированную как пустую строку:
std::string myStr = "";
....some code to optionally populate 'myStr'...
if (myStr != "") {
// do something
}
против. no/null инициализация:
std::string myStr;
....some code to optionally populate 'myStr'...
if (myStr != NULL) {
// do something
}
Есть ли какие-либо лучшие практики или gotchas вокруг этого?
Ответы
Ответ 1
Там функция empty()
готова для вас в std::string:
std::string a;
if(a.empty())
{
//do stuff. You will enter this block if the string is declared like this
}
или
std::string a;
if(!a.empty())
{
//You will not enter this block now
}
a = "42";
if(!a.empty())
{
//And now you will enter this block.
}
Ответ 2
Нет ошибок. Конструкция по умолчанию std::string
равна ""
. Но вы не можете сравнить строку с NULL
. Самое близкое, что вы можете получить, это проверить, является ли строка пустой или нет, с помощью метода std::string::empty
.
Ответ 3
Лучший:
std::string subCondition;
Это создает пустую строку.
Это:
std::string myStr = "";
выполняет инициализацию копии - создает временную строку из ""
, а затем использует конструктор копирования для создания myStr
.
Bonus:
std::string myStr("");
выполняет прямую инициализацию и использует конструктор string(const char*)
.
Чтобы проверить, является ли строка пустой, просто используйте empty()
.
Ответ 4
Пустота и "NULL-ness" - это две разные концепции. Как упоминалось выше, первое может быть достигнуто с помощью std::string::empty()
, последнее может быть достигнуто с помощью boost::optional<std::string>
, например:
boost::optional<string> myStr;
if (myStr) { // myStr != NULL
// ...
}
Ответ 5
Я бы предпочел
if (!myStr.empty())
{
//do something
}
Также вам не нужно писать std::string a = "";
. Вы можете просто написать std::string a;
- по умолчанию он будет пустым
Ответ 6
Конструктор по умолчанию инициализирует строку пустой строкой. Это более экономичный способ сказать одно и то же.
Однако сравнение с NULL
воняет. Это старый синтаксис, который все еще используется, что-то другое; нулевой указатель. Это означает, что вокруг нет строки.
Если вы хотите проверить, является ли строка (которая существует) пустой, используйте вместо этого метод empty
:
if (myStr.empty()) ...