0

I came into an issue when trying to declare an instance of my own class "myClass". For example, myClass class() gave a compile error.

I did some reading and now know why, because I am essentially declaring a function "class" that takes no arguments and returns type "myClass". I see this now. But what I dont understand is if I have an overloaded constructor, why doesn't the compiler think this: myClass class(argument) is me trying to declare a function "class" with one argument that returns type "myClass"?

Is it because there is no argument type, and then it knows its the overloaded constructor?

4

3 回答 3

1

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

于 2013-03-24T23:59:21.263 回答
1

如果argument是变量的名称,或者不能解释为类型的表达式,则编译器无法将其解释为函数声明 - 因为在函数声明中您可以省略参数名称并仅指定它们的类型,但反之则不然。

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

myClass object(myOtherClass());

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

于 2013-03-25T00:02:15.310 回答
1
myClass myclass()

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

当您声明一个调用默认构造函数的类对象时,您可以:

myClass obj;

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

myClass myclass(argument)

意味着创建一个类的对象myClass,具有对象名称myclass

myClass myclass(类型名参数)

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

于 2013-03-25T00:03:57.883 回答