![](/img/trans.png)
[英]What are the names of type(myVar) and (type)myVar? Are they both bad practice?
[英]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)
括号没有帮助:这将使用逗号运算符单独评估x
和y
,然后将y
为type
。
对于非类类型,这种转换通常过于强大。 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.