2012-07-19 124 views
26

它会如何的问题,如果我的C++代码(如下图所示)具有初始化为空字符串的字符串:初始化字符串为空与空字符串

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

与无/空初始化:

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

是否有任何最佳实践或陷阱?

+9

'NULL'(概念上)是一个指针,只能这样使用。一个'std :: string'不是一个指针,所以它不应该被合并。 PS。初始化是相同的:'std :: string'的ctor将它设置为空字符串。 – MSalters 2012-07-19 08:58:45

+0

@MSalters嗨我同意你的观点,但如果类型似乎不兼容为什么编译器不会出错。我有VS 2010,它默默地用NULL初始化std :: string。 – 2014-09-01 10:23:59

+1

@Surfing_SO:有一个字符串构造函数,它接受一个指向字符数组的指针,终止于零个char。您错误地没有传递这样的指针(NULL不指向字符数组或其他任何东西)。这是未定义的行为,在这种情况下可能发生任何事情。 – MSalters 2014-09-01 10:29:11

回答

48

有一个功能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. 
} 
+5

'42'是一切的答案。你知道了吗 – 2017-04-24 14:19:50

2

我会prefere

if (!myStr.empty()) 
{ 
    //do something 
} 

你也不必写std::string a = "";。你可以只写std::string a; - 这将是空的默认

17

有没有陷阱。 std::string的默认结构是""。但是您无法将字符串与NULL进行比较。你可以得到的最接近的是检查字符串是否为空或不使用std::string::empty方法..

+0

当构建'std :: string'并为其分配''“''时有额外的临时性。 – vladon 2015-09-29 18:27:42

+0

@vladon我真的不确定你指的是什么临时的,或者如何分配相关的。我在'a =“”;'a'是'std :: string'时看不到临时的,但问题不在于此。 – juanchopanza 2016-10-22 07:49:21

10

最佳:

std::string subCondition; 

创建一个空的字符串。

此:

std::string myStr = ""; 

做了拷贝初始化 - 从""创建一个临时字符串,然后使用拷贝构造函数来创建myStr

奖励:

std::string myStr(""); 

做了直接初始化,并使用string(const char*)构造。

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

+0

不会'std :: string myStr =“”;'调用一个'string(const char *)'构造函数?你为什么认为会创建一个临时的? – Andrew 2012-07-19 08:13:06

+0

@安德鲁很奇怪,对吧? http://stackoverflow.com/questions/11223285/whats-the-motivation-between-having-copy-and-direct-initialization-behave-diffe – 2012-07-19 08:13:40

+0

+1为链接) – Andrew 2012-07-19 08:19:55

1

默认构造函数将字符串初始化为空字符串。这是说同样的事情的更经济的方式。

但是,比较NULL很臭。这是一个仍然常用的旧语法,意味着别的东西;一个空指针。这意味着没有字符串。

如果你想检查一个字符串(确实存在)是否为空,则使用empty方法来代替:

if (myStr.empty()) ... 
5

空的烦躁和“空性”是两个不同的概念。如其他人提到的,前者可以通过std::string::empty()实现,后者可以通过boost::optional<std::string>实现,例如,:

boost::optional<string> myStr; 
if (myStr) { // myStr != NULL 
    // ... 
}