将字符串初始化为null与空字符串

Sak*_*ket 39 c++ string initialization

如果我的C++代码(如下所示)有一个初始化为空字符串的字符串,这有什么关系:

std::string myStr = "";
....some code to optionally populate 'myStr'...
if (myStr != "") {
    // do something
}
Run Code Online (Sandbox Code Playgroud)

与no/null初始化:

std::string myStr;
....some code to optionally populate 'myStr'...
if (myStr != NULL) {
    // do something
}
Run Code Online (Sandbox Code Playgroud)

有没有最好的做法或陷阱?

Sin*_*all 68

有一个功能empty()为你准备好了std::string:

std::string a;
if(a.empty())
{
    //do stuff. You will enter this block if the string is declared like this
}
Run Code Online (Sandbox Code Playgroud)

要么

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.
}
Run Code Online (Sandbox Code Playgroud)


jua*_*nza 20

没有陷阱.默认构造std::string"".但你不能比较一个字符串NULL.最接近的是使用std::string::empty方法检查字符串是否为空.


Luc*_*ore 16

最好:

 std::string subCondition;
Run Code Online (Sandbox Code Playgroud)

这会创建一个空字符串.

这个:

std::string myStr = "";
Run Code Online (Sandbox Code Playgroud)

进行复制初始化 - 从中​​创建临时字符串"",然后使用复制构造函数进行创建myStr.

奖金:

std::string myStr("");
Run Code Online (Sandbox Code Playgroud)

进行直接初始化并使用string(const char*)构造函数.

要检查字符串是否为空,请使用empty().

  • @JamesKanze是的,但这是一个优化.你不能依赖它.从理论上讲,创造了一个临时工. (2认同)

Ada*_*nek 7

空洞和"空洞"是两个不同的概念.正如其他人所提到的,前者可以通过实现std::string::empty(),后者可以通过boost::optional<std::string>例如:

boost::optional<string> myStr;
if (myStr) { // myStr != NULL
    // ...
}
Run Code Online (Sandbox Code Playgroud)


And*_*rew 5

我希望

if (!myStr.empty())
{
    //do something
}
Run Code Online (Sandbox Code Playgroud)

你也不必写信std::string a = "";。您可以只写std::string a;-默认情况下它将为空