问题说明:
我自己一直很困惑一个问题,就是string用默认初始化和用双引号什么也不加初始化。一直以来,都说这两种方法都是初始化为空,那么有什么区别吗?最近做leetcode题的时候遇到了这个问题,发现还是大有区别的。
string str1;
string str2{""};
我个人对这个问题的理解有限,而且也不是太好阐述,欢迎指正。
区别: (用下面两种表述方式尽可能解释)
1、"" 表示一个string已经创建在了string pool中,但是默认初始化表示什么也不存在。
2、""初始化,也即是str2。表示创建了一个string对象,并且给它分配了"",或者说分配了一个空string对象。通过这种方式初始化,我们创建的变量指向了这个string对象。
但是,我们使用默认初始化的时候,我们并没有创建一个新的string对象。
下面我通过一个vector<string>的对象来说明这个问题,在这里就很明显了;通过输出可以看出,初始化为"" ,是实实在在地占了一个位置。而默认初始化却没有。
#include <iostream>
#include <vector>
#include <string>
using namespace std;
int main()
{
vector<string> str{""};
vector<string> temp;
str.push_back("zhao");
temp.push_back("zhao");
cout<<"the size of str: "<<str.size()<<endl;
cout<<"the size of temp: "<<temp.size()<<endl;
for(auto z:str)
{
cout<<z<<"kk ";
}
cout<<endl;
cout<<temp[0]<<endl;
return 0;
}
输出:
the size of str: 2
the size of temp: 1
kk zhaokk
zhao
注:这两种方式初始化一个string都可以使用 str+a_string的用法。即str1+"zhao"和str2+"zhoa" 都是可以的。
要是需要对vector<string>用范围for循环这样的语句时,就应该使用 "" 来初始化。