我知道C ++中没有返回类型的构造函数
但是,下面的代码编译正确。下面的代码中的构造函数返回了什么?
class A{
public:
A() {}
}
A a = A(); //what is returned by A() here, why?
这里有冲突吗?
答案 0 :(得分:17)
构造函数没有返回任何内容。语法A()
不是构造函数调用,它创建类型为A
的临时对象(并在进程中调用构造函数)。
你不能直接调用构造函数,构造函数被称为对象构造的一部分。
在您的代码中,在构造临时期间,将调用默认构造函数(您定义的构造函数)。然后,在构造a
期间,使用临时作为参数调用复制构造函数(由编译器自动生成)。
正如Greg正确指出的那样,在某些情况下(包括这个),编译器可以避免copy-construction和default-construct a
(但是复制构造函数必须是可访问的)。我知道没有编译器不会执行这样的优化。
答案 1 :(得分:4)
语法T()
,其中T
是某种类型,是一种函数转换符号,用于创建类型为T
的值初始化对象。这不一定涉及构造函数(它可能或可能不会)。例如,int()
是完全有效的表达式,类型int
没有构造函数。在任何情况下,即使类型T
具有构造函数,将T()
解释为“从构造函数返回的内容”也是不正确的。这不是构造函数调用。
答案 2 :(得分:0)
我能提出的唯一可能的解释可能是编译器将代码扩展为:
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.
*/
P.S:我测试代码后未调用复制构造函数。