我正在cplusplus.com上阅读完整的教程,手动编写和编译每个示例。我经常偶然发现让我感到困惑的事情。
我目前正在学习这一部分:http://www.cplusplus.com/doc/tutorial/structures/。只有阅读教程才能轻易忽略一些细微之处。手工输入所有东西的好处是这些细节确实很突出。
在上面的页面中,有两个示例程序。一个人有这条线:
stringstream(mystr) >> yours.year;
另一个有这条线:
(stringstream) mystr >> pmovie->year;
我不明白的是type (myVar) = x;
和(type) myVar = x;
之间的区别(如果有的话)。
我没有按顺序执行整个教程。我检查了但是没有发现这个地址,但我可能已经错过了它。
答案 0 :(得分:56)
type(x)
和(type)x
之间没有区别。这两个是完全相同的。大多数人喜欢type(x)
用于类,(type)x
用于非类型,但这纯粹取决于自己的选择。两个都为具有一个参数x
的类调用构造函数。
类的首选方法是type(x)
,因为这允许将多个参数传递给构造函数,如type(x, y)
中所示。尝试应用其他表单时,(type)x, y
将不起作用:它会转换x
,然后单独应用逗号运算符和evalutes y
。像(type)(x, y)
这样的括号无效:这将使用逗号运算符隔离评估x
和y
,然后将y
投射到type
。
对于非类型类型,此类演员通常过于强大。 C ++有static_cast<type>(x)
用于粗略地执行隐式转换的反向(例如将基类转换为派生类并将void*
转换为另一个指针),这通常适用于此。请参阅When should static_cast, dynamic_cast and reinterpret_cast be used? 。
stringstream
不是一个功能。执行function(x)
会将其称为函数,但执行(function)x
是非法的,因为有两个表达式彼此相邻,中间没有运算符。
对于那些不相信这个答案的人,并以直觉的方式对其进行投票,请参阅5.2.3/1
标准
简单类型说明符(7.1.5)后跟带括号的表达式列表,在给定表达式列表的情况下构造指定类型的值。如果表达式列表是单个表达式,则类型转换表达式与相应的强制转换表达式(5.4)等效(在定义中,如果在含义中定义)。
答案 1 :(得分:4)
您引用的页面并不是我认为的C ++权威。
反正
(stringstream)mystr&gt;&gt; pmovie-&GT;年;
将std::string
强制转换为std::stringstream
个对象。这是一个C风格的演员阵容。如果你不知道自己在做什么,那就相当危险了。这将创建一个stringstream
对象,然后将值提取到pmovie->year
。
stringstream(mystr)&gt;&gt; yours.year;
创建一个匿名std::stringstream
对象,并使用mystr
对其进行初始化,然后将该值提取到pmovie->year
。该对象在其词法范围的末尾消失,在这种情况下,它将是该行末尾的;
。
两个w.r.t类对象中没有太大区别(正如其他人已经注意到的那样)。
另一方面,使用标识符(函数/宏)这会变得棘手:function (myVar) = x;
无论function
是实际函数还是宏,都可以工作。但是,(function) (myVar) = x;
仅适用于实际功能。
允许一些标准库标识符具有两种形式(最明显的是tolower
和朋友),因此如果您想要始终调用该函数,那么您应该选择前者。