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',但编译器可以优化它并省略复制。
它认为
string strA();
为函数声明。
对于默认构造函数中使用:
string strA;
您可以在分配堆时使用该表示法: 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
具有用户定义的构造函数,因此可以省略括号,并且效果与预期相同。
这就是我停止使用C++的原因之一。 – 2009-05-29 11:57:59
@Dietrich Epp:这也困扰我。我想这是支持C兼容性的价格。另一种方法是使用C,其中有很多问题,我的猜测是最好保留C++并避免这个缺陷。 – paercebal 2011-09-17 10:52:14
`std :: string strA(“”);` – CaptainDaVinci 2017-03-13 16:15:31