【问题标题】:Difference between "class variable", "class variable()", and "class variable(argument)“类变量”、“类变量()”和“类变量(参数)”之间的区别
【发布时间】:2013-03-24 23:57:00
【问题描述】:

我在尝试声明我自己的类“myClass”的实例时遇到了问题。 例如,myClass class() 给出了编译错误。

我做了一些阅读,现在知道为什么了,因为我本质上是在声明一个函数“类”,它不带参数并返回类型“myClass”。我现在看到了。但我不明白的是,如果我有一个重载的构造函数,为什么编译器不这么认为:myClass class(argument) 我是否试图用一个返回类型“myClass”的参数声明一个函数“类”?

是不是因为没有参数类型,然后才知道它的构造函数重载了?

【问题讨论】:

  • 对于它的价值,你的问题是经常讨论的主题most-vexxing-parse
  • @WhozCraig - 这不是“最令人头疼的解析”。它只是一个函数声明。最令人头疼的解析涉及使用默认构造的临时参数调用函数;编译器将构造视为参数声明(带有多余的括号),并给出错误。

标签: c++ variables


【解决方案1】:
myClass myclass()

声明一个名称为myclass、返回类型为myClass且无参数的函数。这被称为http://en.wikipedia.org/wiki/Most_vexing_parse

当你声明一个调用默认构造函数的类对象时,你这样做:

myClass obj;

函数的参数必须是某种类型。

myClass myclass(argument)

表示创建类myClass的对象,对象名称为myclass

myClass myclass(类型名参数)

声明一个函数,它不调用任何构造函数,typename是必需的,但argument在函数原型中是可选的。

【讨论】:

  • 实际上myClass class()不会编译,因为class是保留字。
  • 第一行中的示例通常不被认为是“最令人烦恼的解析”,afaik。该术语通常被认为是指 Andy Prowl 在他的回答中引用的结构。
  • @us2012 该示例也是 vex of parsing 的一个实例。请参阅此帖子的第二个答案:stackoverflow.com/questions/2318650/…
【解决方案2】:

如果argument 是一个变量的名称,或者一个不能被解释为类型的表达式,那么编译器就无法将它解释为一个函数声明——因为在函数声明,您可以省略参数 names 并仅指定其类型,反之则不行。

但是,如果你有这样的事情:

myClass object(myOtherClass());

您可能认为这是从默认构造的 myOtherClass 类型的临时临时对象复制构造名为 object 的对象的尝试,您会遇到所谓的 Most Vexing Parse:编译器,实际上, 会将上面的内容解释为一个名为 object 的函数的声明,该函数返回一个 myClass 类型的对象,并接受一个函数作为其唯一参数,而该函数又不接受任何参数并返回一个 myOtherClass 类型的值。

【讨论】:

  • 那么你会想要省略括号吗? myClass class(myOtherClass)
  • @user2205782:这将是一个函数声明(一个名为 class 的函数 - 顺便说一句,这是一个关键字,所以你应该选择另一个名称 - 它采用 myOtherClass 类型的对象作为它唯一的参数并返回一个类型为myClass的对象)。在 C++11 中,您可以通过使用大括号语法而不是括号来解决歧义:例如,myClass object{}myClass object{myOtherClass{}} - 第一个默认构造 myClass 的实例,第二个构造一个实例myClass 提供默认构造的 myOtherClass 实例作为参数。
【解决方案3】:

没错。函数声明的参数必须是类型,所以如果它们不是类型,编译器知道它不能是函数声明,而是假定您正在构造一个实例并将参数作为参数传递。这个逻辑工作得很好,除了在构造函数没有参数的特殊情况下,在这种情况下它是模棱两可的。 C++ 通过尽可能将语句视为声明来解决这种歧义,因此要创建不带参数的实例,请不要使用参数列表。

【讨论】:

  • MyClass f(); 不是模棱两可。这是一个函数声明。
猜你喜欢
  • 1970-01-01
  • 2015-10-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-02-15
  • 1970-01-01
  • 2020-05-09
  • 2023-04-06
相关资源
最近更新 更多