我需要在C++中声明一个新的string
变量,并从标准输入中读取它。
我是否必须首先初始化字符串,或者这是不必要的步骤?换句话说,哪个代码更好:选项1还是选项2(或者它们相同)?
1)
选项1和选项2是等效的,都可以使用。在C++中,如果您没有显式地初始化字符串,则会默认为一个空字符串。
string s = "";
cin >> s;
string s;
cin >> s;
我需要在C++中声明一个新的string
变量,并从标准输入中读取它。
我是否必须首先初始化字符串,或者这是不必要的步骤?换句话说,哪个代码更好:选项1还是选项2(或者它们相同)?
1)
选项1和选项2是等效的,都可以使用。在C++中,如果您没有显式地初始化字符串,则会默认为一个空字符串。
string s = "";
cin >> s;
string s;
cin >> s;
对于std::string
来说,这两行代码实际上是行为相同的。因为std::string
的默认构造函数会将其初始化为空字符串:
默认构造函数。构造一个空字符串(大小为零,容量未指定)。(来源)
从行为上看,这两行代码本质上是相同的。选择使用哪个并不重要,但我认为如果默认构造函数已经做了同样的事情,那么赋值操作就是多余的。
如果你有一些没有默认构造函数的整数类型,通常大多数人仍然保持它们未初始化,因为输入紧随其后。然而,我发现最好使用默认值来初始化这样的变量,因为这可以处理输入失败的情况(无效类型、坏的流状态等)。
对于 std::string
,默认初始化是可以的,但是通过使用(立即调用初始化)lambda表达式,您可以更进一步:
std::string s = []() {
std::string r;
std::cin >> r;
return r;
}(); //IIIL
这遵循了“始终初始化您的变量”的规则,并且作为奖励,如果需要,允许您将字符串声明为const
并仍然能够从源中读取:
const std::string s = []() {
std::string r;
std::cin >> r;
return r;
}(); //IIIL