繁体   English   中英

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

[英]What's the difference between type(myVar) and (type)myVar?

我正在cplusplus.com上阅读完整的教程,手动编码和编译每个示例。 经常,我偶然发现一些令我困惑的东西。

我目前正在学习本节: http : //www.cplusplus.com/doc/tutorial/structures/ 仅阅读本教程,就可以轻松忽略一些细微之处。 手动键入所有内容的优点是,此类详细信息确实突出。

在上一页中,有两个示例程序。 一个有这行:

stringstream(mystr) >> yours.year;

另一个有这一行:

(stringstream) mystr >> pmovie->year;

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

我没有按顺序完成整个教程。 我检查了一下,但没有找到解决的地方,尽管我可能错过了。

  • 有区别吗?
  • 有没有一种首选的方式来做到这一点而不是另一种方式?

type(x)(type)x之间没有区别。 这两个是完全等效的。 大多数人喜欢将type(x)用于类,将(type)x用于非类类型,但这完全取决于自己的选择。 两者都调用带有一个参数x类的构造函数。

类的首选方式是type(x) ,因为这样可以将多个参数传递给构造函数,就像type(x, y) 尝试应用其他形式(type)x, y无效:它强制转换x ,然后应用逗号运算符并单独评估y (type)(x, y)括号没有帮助:这将使用逗号运算符单独评估xy ,然后将ytype

对于非类类型,这种转换通常过于强大。 C ++已static_cast<type>(x)对大致做的隐式转换的反向(例如铸造基类派生的类和铸造void*到另一个指针),这往往是在什么适合参见何时应的static_cast,将dynamic_cast,使用reinterpret_cast?

stringstream不是函数。 执行function(x)会将该函数称为函数,但是执行(function)x是非法的,因为彼此之间有两个表达式,并且它们之间没有运算符。


对于那些不相信该答案并因直觉而投票否决的人,请查阅标准5.2.3/1

一个简单类型说明符(7.1.5)后跟一个带括号的表达式列表,可在给定表达式列表的情况下构造指定类型的值。 如果表达式列表是单个表达式,则类型转换表达式(在定义上以及含义上)与相应的强制转换表达式(5.4)等效。

通常,您引用的页面不是我认为的C ++授权。

无论如何,

(stringstream)mystr >> pmovie-> year;

std::string转换为std::stringstream对象。 这是C样式的强制转换。 如果您不知道自己在做什么,那就比较危险。 这将创建一个stringstream对象,然后将值提取到pmovie->year

stringstream(mystr)>> yours.year;

创建一个匿名std::stringstream对象,并使用mystr对其进行初始化,然后将该值提取到pmovie->year 对象在其词法范围的尽头消失,在这种情况下将是; 在该行的末尾。

这两个wrt类对象之间没有太大的区别(如到目前为止其他人所指出的)。

另一方面,使用(函数/宏的)标识符会比较棘手: function (myVar) = x; 无论function是实际函数还是宏,它都可以工作。 但是, (function) (myVar) = x; 仅适用于实际功能。

某些标准库标识符被允许同时具有两种形式(最著名的是tolower和friends),因此,如果您始终要调用该函数,则应使用前者。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM