C++空String构造函数

Geo*_*rge 16 c++ string

我是一名C++初学者,如果问题太基础,那就很抱歉.

我试图收集字符串constrcturs并尝试所有它们(记住它们).

string strA();          // string(); empty string // incorrect
string strB("Hello");   // string( const char* str)
string strC("Hello",3); // string( const char* str, size_type length)
string strD(2,'c');     // string( size_type lenght, const char &c)
string strE(strB);      // string( const string& s)

cout << strA << endl;
cout << strB << endl;
cout << strC << endl;
cout << strD << endl;
cout << strE << endl;
Run Code Online (Sandbox Code Playgroud)

strA外,所有这些都有效.它打印"1".为什么?在这种情况下,strA的类型是什么?当我不确定时,如何检查东西的类型?

我注意到这是正确的方法(顺便说一句,这似乎与其他构造函数不一致,有时候parens有时没有parens):

string strA;
Run Code Online (Sandbox Code Playgroud)

ps:大胆的问题,通常不相关的答案将被低估.

Tad*_*pec 32

这是一个非常受欢迎的问题.C++语法含糊不清.解决歧义的规则之一是"如果某些事情看起来像宣言那就是宣言".在这种情况下,您不是定义变量,而是声明了函数原型.

string strA();
Run Code Online (Sandbox Code Playgroud)

相当于

string strA(void);
Run Code Online (Sandbox Code Playgroud)

返回字符串的无参数函数的原型.

如果你想显式调用no-arg构造函数,试试这个:

string strA=string();
Run Code Online (Sandbox Code Playgroud)

它不完全等价 - 它意味着'使用no-arg构造函数创建一个临时字符串,然后将其复制到初始化变量strA',但允许编译器对其进行优化并省略复制.

编辑: 这是C++ FAQ Lite中的一个合适的项目

  • 这就是我停止使用C++的原因之一. (3认同)
  • @Dietrich Epp:这也困扰着我.我想这是保持C兼容性的代价.替代方案是使用C,它有很多问题,我的猜测是保持C++并避免陷阱更好. (3认同)

Căt*_*tiș 13

它认为

string strA();
Run Code Online (Sandbox Code Playgroud)

作为功​​能声明.

对于默认构造函数使用:

string strA;
Run Code Online (Sandbox Code Playgroud)

  • 在分配堆时可以使用该表示法:string*strA = new string(); (2认同)

小智 6

在C++中,就像在C中一样,有一条规则说任何看起来像声明的东西都会被视为声明.

string strA();
Run Code Online (Sandbox Code Playgroud)

看起来像一个函数声明,所以它被视为一个.你需要:

string strA;
Run Code Online (Sandbox Code Playgroud)