当我试图声明我自己的类“myClass”的实例时,我遇到了一个问题。
例如,myClass class()
给出了编译错误。
我做了一些阅读,现在知道原因,因为我基本上声明了一个不带参数的函数“class”,并返回类型“myClass”。我现在看到了。但我不明白的是,如果我有一个重载的构造函数,为什么编译器不这么认为:myClass class(argument)
我试图用一个返回类型为“myClass”的参数声明一个函数“class”?
是因为没有参数类型,然后它知道它的重载构造函数吗?
答案 0 :(得分:1)
没错。函数声明的参数必须是类型,因此如果它们不是类型,编译器就知道它不能是函数声明,而是假设您正在构造一个实例并将参数作为参数传递。除了在构造函数没有参数的特殊情况下,这种逻辑非常有效,在这种情况下它是不明确的。 C ++通过在可能的情况下将语句视为声明来解决这种歧义,因此要创建一个没有参数的实例,请不要使用参数列表。
答案 1 :(得分:1)
如果argument
是变量的名称,或者表达式不能解释为类型,那么编译器无法将其解释为函数声明 - 因为在函数声明中你可以省略参数 names 并只指定它们的类型,但反之不然。
但是,如果您有这样的事情:
myClass object(myOtherClass());
您可能会认为尝试从类型为object
的默认构造临时文件中复制构造名为myOtherClass
的对象,您将遇到所谓的Most Vexing Parse :事实上,编译器会将上面解释为一个名为object
的函数的声明,该函数返回一个类型为myClass
的对象,并接受一个函数,该函数反过来不带参数并返回myOtherClass
类型的值。
答案 2 :(得分:1)
myClass myclass()
声明一个名为myclass
的函数,返回类型myClass
并且没有参数。这称为http://en.wikipedia.org/wiki/Most_vexing_parse
当您声明一个调用默认构造函数的类对象时,您可以执行以下操作:
myClass obj;
函数的参数必须是某种类型。
myClass myclass(argument)
表示创建类myClass
的对象,对象名为myclass
。
myClass myclass(typename argument)
声明一个函数,它不调用任何构造函数,typename
是必需的,但argument
在函数原型中是可选的。