如果我的C ++代码(如下所示)将字符串初始化为空字符串,那将是多么重要:
std::string myStr = "";
....some code to optionally populate 'myStr'...
if (myStr != "") {
// do something
}
VS。 no / null初始化:
std::string myStr;
....some code to optionally populate 'myStr'...
if (myStr != NULL) {
// do something
}
是否有最佳做法或陷阱?
答案 0 :(得分:65)
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.
}
答案 1 :(得分:20)
没有陷阱。 std::string
的默认构造为""
。但是你无法将字符串与NULL
进行比较。您可以获得的最接近的是使用std::string::empty
方法检查字符串是否为空。
答案 2 :(得分:14)
最佳:
std::string subCondition;
这会创建一个空字符串。
此:
std::string myStr = "";
执行复制初始化 - 从""
创建临时字符串,然后使用复制构造函数创建myStr
。
加成:
std::string myStr("");
进行直接初始化并使用string(const char*)
构造函数。
要检查字符串是否为空,请使用empty()
。
答案 3 :(得分:6)
空洞和" NULL-ness"是两个不同的概念。正如其他人提到的那样,前者可以通过std::string::empty()
实现,后者可以通过boost::optional<std::string>
来实现,例如:
boost::optional<string> myStr;
if (myStr) { // myStr != NULL
// ...
}
答案 4 :(得分:3)
我更喜欢
if (!myStr.empty())
{
//do something
}
此外,您不必撰写std::string a = "";
。你可以写std::string a;
- 默认情况下它是空的
答案 5 :(得分:1)
默认构造函数将字符串初始化为空字符串。这是说同样事情的更经济的方式。
然而,与NULL
的比较很糟糕。这是一种仍然常用的旧语法,意味着其他东西;空指针。这意味着周围没有字符串。
如果要检查字符串(确实存在)是否为空,请改用empty
方法:
if (myStr.empty()) ...