C++空字符串构造函数

C++空字符串构造函数

问题描述:

我是C++初学者,很抱歉如果问题太简单。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; 

所有这些作品除了STRA。它打印“1”。 为什么?在这种情况下strA的类型是什么?我不确定时如何检查东西的类型?

我已经注意到了,正确的方法是这样的(有时是其中的方式似乎是与其他构造函数不一致,有时的括号没有括号):

string strA; 

PS:粗体,通常不相关的问题答案将被降低。

这是一个非常流行的疑难杂症。 C++语法不明确。解决歧义的规则之一是“如果某件事看起来像是声明,那么它就是一种声明”。在这种情况下,而不是定义一个变量,你声明了一个函数原型。

string strA(); 

相当于

string strA(void); 

返回字符串一个无参数的函数的原型。

如果你想显式调用无参数的构造试试这个:

string strA=string(); 

它不完全等同 - 这意味着“使用无参数的构造函数创建一个临时字符串,然后把它复制到初始化变量strA',但编译器可以优化它并省略复制。

编辑: Here is an appropriate item in C++ FAQ Lite

+3

这就是我停止使用C++的原因之一。 – 2009-05-29 11:57:59

+3

@Dietrich Epp:这也困扰我。我想这是支持C兼容性的价格。另一种方法是使用C,其中有很多问题,我的猜测是最好保留C++并避免这个缺陷。 – paercebal 2011-09-17 10:52:14

+0

`std :: string strA(“”);` – CaptainDaVinci 2017-03-13 16:15:31

它认为

string strA(); 

为函数声明。

对于默认构造函数中使用:

string strA; 
+2

您可以在分配堆时使用该表示法: string * strA = new string(); – Skilldrick 2009-05-29 11:27:19

在C++中,在C,有一个说,任何看起来像一个declarartion将作为申报进行处理的规则。

string strA(); 

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

string strA; 

编译器解释string strA()因为这需要空参数并返回字符串类型的对象的函数的函数原型。如果你想创建一个空字符串对象,使用string strA;(不含pamentalhesis)

它打印1因为函数指针将被转换成数字作为true

tkopec是正确的,为什么它不工作。要回答你的第二个问题,这里是你如何检查类型:

template<typename TEST> void Error_() { 
    TEST* MakeError = 1; 
} 

通过调用Error_(StrA);你会得到一个编译错误,和你的编译器可能会告诉你,这在Error_< std::basic_string<char, std::allocator<char> > (*)(void)>(std::basic_string<char, std::allocator<char> > (*)(void)) 发生现在的std :: basic_string的>只是std :: string,所以这真的意味着Error_< std::string (*)(void)> (std::string (*)(void))。在'()'之间重复'<>'之间的部分,这就是strA的类型。在这种情况下,std::string (*)(void)

我不认为在这种情况下,规则“如果它可以是一个声明,它被认为是一个声明”适用。由于在下文中,这两个事情是声明

string a; 
string a(); 

的一个为对象的声明,而另一个是一个函数的声明。该规则适用于其他情况。例如,在这种情况下:

string a(string()); 

在这种情况下,string()可以表示两件事情。

  • 未命名的函数参数的声明构成
  • 表达创建默认string

的福乐在这里也适用,并且string()被认为是指相同的下面,命名参数(名称无关紧要在声明功能时参数)

string a(string im_not_relevant()); 

如果一个函数使用参数作为数组或参数她的功能,该参数衰减成一个指针。在函数参数的情况下,指向函数的指针。因此,它相当于以下,这可能看起来更熟悉

string a(string (*im_not_relevant)()); 

但在你的情况,这是毋宁说是越来越进入方式的语法。这是说,以下是一个函数声明。它不可能是一个对象的声明(尽管这可能是由程序员意!)

string a(); 

所以在这种情况下在第一时间没有歧义,因此声明的函数。由于string具有用户定义的构造函数,因此可以省略括号,并且效果与预期相同。