“类变量”,“类变量()”和“类变量(参数)”之间的区别

时间:2013-03-24 23:57:01

标签: c++ variables

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

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

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

3 个答案:

答案 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在函数原型中是可选的。