type(myVar)和(type)myVar有什么区别?

时间:2010-08-14 17:25:47

标签: c++

我正在cplusplus.com上阅读完整的教程,手动编写和编译每个示例。我经常偶然发现让我感到困惑的事情。

我目前正在学习这一部分:http://www.cplusplus.com/doc/tutorial/structures/。只有阅读教程才能轻易忽略一些细微之处。手工输入所有东西的好处是这些细节确实很突出。

在上面的页面中,有两个示例程序。一个人有这条线:

stringstream(mystr) >> yours.year;

另一个有这条线:

(stringstream) mystr >> pmovie->year;

我不明白的是type (myVar) = x;(type) myVar = x;之间的区别(如果有的话)。

我没有按顺序执行整个教程。我检查了但是没有发现这个地址,但我可能已经错过了它。

  • 有区别吗?
  • 是否有一种首选方式而不是另一种方式?

2 个答案:

答案 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)这样的括号无效:这将使用逗号运算符隔离评估xy,然后将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-&G​​T;年;

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和朋友),因此如果您想要始终调用该函数,那么您应该选择前者。