构造函数返回什么?

11

我的问题是构造函数返回什么?这个问题与“构造函数的返回类型是什么?”并没有太大不同。 我曾经在某处读到,构造函数隐式地返回一个完整的对象(即隐式返回类型是类名),但不应明确指定。

struct empty{};

int main(){
   empty(); //creates a temporary and implicitly a constructor is called
}

据我理解,隐式返回类型应该是类的名称,即empty。我的解释是否正确?


当你调用 new Class(); 时,它会返回一个指向该类实例位置的指针。这是你所指的吗? - xxpor
相关:http://stackoverflow.com/questions/3598833/how-does-it-work-test-pobj-new-test-as-constructor-does-not-return-anythin - liaK
c++-faq 标签中移除。如果您不同意,请讨论 - sbi
6个回答

35

构造函数不返回任何东西。 构造函数被调用以初始化对象。 构造函数只能用于初始化对象; 实际上无法显式地调用构造函数(首先,构造函数没有名称)。

在您给出的示例中,empty()不是函数调用表达式,而是值初始化。 它创建了一个类型为empty的值初始化临时对象。


1
@Invisible:该语句的重要部分是“在某种意义上”,这并不是严格正确的,但它是对构造函数和初始化的很好的思考方式。 - James McNellis
2
在“你实际上不能调用构造函数”的基础上,有时候有理由希望在已经分配了内存的情况下构造对象。显式调用构造函数的想法可能很有吸引力,但事实上,即使这样也行不通。而是使用“放置new”语法。尽管在轻微的不对称性中,与此相补偿的清除操作(销毁对象但不释放内存)是显式的析构函数调用,而不是“放置delete”。 - user180247
1
Terminator().say(); 这是什么意思?看起来像是对已创建对象的引用。有点... - mip
1
@doc: 是的。它构造了一个临时的Terminator对象,在该临时对象上调用Terminator::say(),然后销毁该临时对象。临时对象直到构造它们的完整表达式结束才被销毁。 - James McNellis
1
那么,我们可以说构造函数不返回任何东西,但它具有按值返回的语义吗? :P 我想象一下,如果指定了返回类型,签名会像Terminator Terminator :: Terminator()而不是void Terminator :: Terminator() - mip
显示剩余6条评论

11

构造函数确实返回一些东西。它返回指向this所指对象的引用。因此,构造函数的隐式返回语句如下:

构造函数确实返回一些东西。它返回指向this所指对象的引用。因此,构造函数的隐式返回语句如下:

*this;

这是如何使用的?

如果您创建一个带有“通用”成员类型的 something 类模板,则在类 something 的构造函数中显式调用通用类型的默认零参数构造函数(即 generic()),并通过 something 构造函数的赋值运算符和初始化语句初始化您的通用成员。构造函数必须返回某些内容,否则我刚才写的内容中没有一个会起作用。这在我正在阅读的书籍中有提到。


3

构造函数不返回任何内容。
在对象创建时,构造函数会隐式调用以初始化正在创建的对象。


1
那么,这个语句怎么才能合法呢?:MyClass myclass = MyClass(); - hkBattousai
@hkBattousai,有一堆特殊规则处理初始化器。不幸的是,这与如何获得类似于从构造函数返回的东西没有任何关系。由于构造函数甚至没有名称(这里的类名由声明符的特殊规则处理,而不是函数调用的后缀表达式),因此您无法引用其类型,因此“返回类型”(如果有)就没有意义。 - FrankHB

2
一个构造函数不返回任何内容。
混淆的来源:
Book *b = new Book();

许多人对上面的代码感到困惑,因为它创建了一个假象,即构造函数返回指向新创建对象的指针。
当您使用new关键字时,编译器会分配所需的内存,然后调用构造函数在分配的内存上创建一个新对象。然后new返回指向该内存块的指针。构造函数只创建对象,从不返回任何东西。

0
在C++里,如果我没记错的话,你的代码会为栈上的“空”分配足够的空间,然后隐式地调用empty的默认构造函数--如()所指定--并将一个this引用隐式地传递给它。没有返回值。在你的情况下也没有构造函数。

所有的类/结构体都有构造函数。在这种情况下,有一个“默认默认构造函数”——什么也不做的默认构造函数,除非你另有规定,否则每个类型都会得到它。如果我没记错,在C++0x中它将是一个填充为零的隐式默认构造函数。 - user180247
和其他回答一样,new分配内存空间,而不是构造函数。 - edA-qa mort-ora-y

-1

这个怎么样:

int main() {
const empty &er = empty();
empty *ep = const_cast<empty*>(er); //casting away conentness to make changes in the members
cout<<"\n main ends \n";
//dtor get called here
}

ctor返回一个指向内存位置(*this)的const引用,您可以强制转换掉const并将其用作非const普通对象,例如empty *e = new e;


不错的观点,但是const引用延长了临时对象的生命周期。因此,构造函数的行为就像它返回值一样。如果它返回const引用,你可以只使用empty & er = const_cast<empty &>(empty()) - mip

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