C++中构造函数的返回类型

20

我知道在C++中构造函数是没有返回类型的。

然而,下面的代码可以成功编译。下面的构造函数返回什么?

class A{

public:
A() {}
}


A a = A();      //what is returned by A() here, why?

这里有任何冲突吗?


1
a 是通过拷贝构造函数进行构造的。它是由临时对象 A() 复制而来的。 - GManNickG
3个回答

22

构造函数不返回任何内容。语法A()不是构造函数的调用,而是创建一个类型为A的临时对象(并在此过程中调用构造函数)。

您不能直接调用构造函数,构造函数作为对象构造的一部分被调用。

在您的代码中,在临时对象构造期间调用了默认构造函数(您定义的那个)。然后,在构造a期间,以临时对象为参数自动生成编译器的复制构造函数被调用。

正如Greg正确指出的那样,在某些情况下(包括这种情况),编译器允许避免复制构造和默认构造a(但必须可以访问复制构造函数)。我不知道有哪个编译器不会执行这样的优化。


你不能直接调用构造函数 - 当然可以:A a()。此外,你的编译器可能会将 A a = A() 转换为 A a() 以避免冗余对象复制。 - Greg Hewgill
11
"A a()" 是一个函数声明。 - avakar
3
此外,即使 A 有另一个构造函数,比如 A(int),代码 A a(1) 也不再是直接调用构造函数,就像 new(&a) A(1) 一样。 - avakar
1
那些罕见的时候我需要“调用构造函数”,我会使用类似new(&a) A;这样的东西来使用当前的示例。我认为这是可恶的,我的大脑拒绝记住我认为我需要它的原因。 - Mike D.
1
@Greg:不,这并不是“直接调用构造函数”。它构造了一个临时对象,恰好包括调用构造函数。 - jalf

3
代码中的语法T()表示一种函数式转换,创建一个类型为T的值初始化对象。这并不一定涉及构造函数(可能有也可能没有)。例如,int()是一个完全有效的表达式,而类型int没有构造函数。无论如何,即使类型T具有构造函数,将T()解释为“从构造函数返回的东西”是错误的。这不是一次构造函数调用。

1
一个强制转换是显式的。函数式转换符号具有强制转换语法。T()从哪里进行“转换”? - curiousguy

-1
我能想到的唯一可能解释就是编译器已经将代码增强为:
A 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:当我测试代码时,未调用复制构造函数。可能编译器已经优化了代码并删除了调用复制构造函数的要求。如果有人找到正确答案,请告诉我。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接