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

aug*_*tin 15 c++

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

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

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

stringstream(mystr) >> yours.year;
Run Code Online (Sandbox Code Playgroud)

另一个有这条线:

(stringstream) mystr >> pmovie->year;
Run Code Online (Sandbox Code Playgroud)

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

我没有按顺序执行整个教程.我查了但是没有找到这个地址,但我可能错过了它.

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

Joh*_*itb 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单独使用,然后转换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)等效(在定义中,如果在含义中定义).

  • 谁*地狱*在这个答案中投票? (12认同)
  • 这不是神经科学:这些问题完全由标准规定,人们对语言的看法与其语义无关.显然你已经决定了这个问题,这是一个遗憾,但我不想改变它.我有更好的方法来度过我的时间:) (4认同)
  • @nico我想说的是,两者都是演员表.两者都为类调用构造函数,而不是非类.你可以说int(some_pointer)和(int)some_pointer.我认为没有任何价值可以说一个表单会调用一个构造函数,而另一个表单会成为一个投射,因为它表明存在一些不存在的差异.在int(some_pointer)中没有construtor调用.我可以将`10`称为"创建",将"0x10"称为小数的"转换",因为它具有可爱的语法,但这并没有改变它的*语义*.这完全是主观的. (3认同)
  • @nico 这不是意见问题。该标准定义了什么是等效的,什么不是。它将这两者定义为等效的,因此由编码风格决定在什么情况下使用什么。 (2认同)
  • @nico哦,我正在开玩笑.这是星期天,是时候享受一些乐趣.但严重的是,标准说两件事情是等价的 - 我认为这是一个明确的陈述.我不认为这可以解释.如果你能展示一个清楚地显示这两种形式之间行为不同的代码示例,我将很高兴.我认为我同意它们*词法*不同,就像"15"和"0xf""不同"一样,但这又如何重要?无论您是以十进制还是十六进制输入,都完全取决于您自己的选择. (2认同)