我知道在C++中构造函数是没有返回类型的。
然而,下面的代码可以成功编译。下面的构造函数返回什么?
class A{
public:
A() {}
}
A a = A(); //what is returned by A() here, why?
这里有任何冲突吗?
我知道在C++中构造函数是没有返回类型的。
然而,下面的代码可以成功编译。下面的构造函数返回什么?
class A{
public:
A() {}
}
A a = A(); //what is returned by A() here, why?
这里有任何冲突吗?
构造函数不返回任何内容。语法A()
不是构造函数的调用,而是创建一个类型为A
的临时对象(并在此过程中调用构造函数)。
您不能直接调用构造函数,构造函数作为对象构造的一部分被调用。
在您的代码中,在临时对象构造期间调用了默认构造函数(您定义的那个)。然后,在构造a
期间,以临时对象为参数自动生成编译器的复制构造函数被调用。
正如Greg正确指出的那样,在某些情况下(包括这种情况),编译器允许避免复制构造和默认构造a
(但必须可以访问复制构造函数)。我不知道有哪个编译器不会执行这样的优化。
A a()
。此外,你的编译器可能会将 A a = A()
转换为 A a()
以避免冗余对象复制。 - Greg HewgillA
有另一个构造函数,比如 A(int)
,代码 A a(1)
也不再是直接调用构造函数,就像 new(&a) A(1)
一样。 - avakarnew(&a) A;
这样的东西来使用当前的示例。我认为这是可恶的,我的大脑拒绝记住我认为我需要它的原因。 - Mike D.T()
表示一种函数式转换,创建一个类型为T
的值初始化对象。这并不一定涉及构造函数(可能有也可能没有)。例如,int()
是一个完全有效的表达式,而类型int
没有构造函数。无论如何,即使类型T
具有构造函数,将T()
解释为“从构造函数返回的东西”是错误的。这不是一次构造函数调用。T()
从哪里进行“转换”? - curiousguyA a = A();
/*
compiler generated code.
A a;
a.A::A();
a.A::~A(); destructor will also be inserted by compiler after "a" goes out of scope.
*/
构造函数没有返回类型,甚至没有void,因为这不是必需的。构造函数内部的每个成员访问都通过“this”指针完成,因此如果构造函数具有指针可以执行其修改操作,为什么需要返回它。
P.S:当我测试代码时,未调用复制构造函数。可能编译器已经优化了代码并删除了调用复制构造函数的要求。如果有人找到正确答案,请告诉我。
a
是通过拷贝构造函数进行构造的。它是由临时对象A()
复制而来的。 - GManNickG