2011-04-22 57 views
0

C++说我们不能从构造函数中返回任何东西?背后的历史原因是什么? 为什么Bjarne不允许构造函数返回与其他成员函数不同的东西?为什么我们不能从构造函数中返回任何东西?

+6

你会回来么? – BlackBear 2011-04-22 15:51:54

+1

对于从构造函数返回* something *的建议,你有什么理由?我会说它没有意义,这就是为什么它不返回*的东西*。 – Nawaz 2011-04-22 15:52:30

+0

BlackBear该类的对象。我知道这是隐含的,但为什么? – user724619 2011-04-22 15:52:50

回答

4

因为当在new语句或变量初始值设定项中构造对象时,返回的对象是正在构造的新对象。对于从构造函数返回的对象,你会做什么?它永远无法返回到任何地方;它是正在返回的构造对象。该对象在构造函数被调用之前已经(部分)创建(否则,构造函数将没有对象可用),并且它必须是从构造函数返回的内容,所以没有必要让用户返回它或让它们通过尝试返回不同的东西来混淆自己。

+0

不够公平。接受你的答案。 – user724619 2011-04-22 16:06:33

+0

还要考虑临时性 - 'std :: string(“hello,world”)'。这既不是一个新的声明,也不是一个变量初始值设定项,所以你可以简单地想象它可能会返回一个不同的对象。但是,对象占用的内存不是由构造函数提供的,也没有明智的方式让对象可以在临时创建的堆栈空间之外的任何地方,最好*不要*认为这是“仅仅对构造函数的调用“。 – 2011-04-22 17:12:35

1

的构造函数只能得到对象本身...

3

我认为一个构造函数返回本身,但不必有return声明。

如果它自己返回,那么它不能返回任何其他东西。

2

我不能说Bjarne,但查看构造函数的惯用方式是它返回它构造的对象。

+0

:)因此,术语 - C O N S T R U C T O R – KevinDTimm 2011-04-22 15:56:35

1

除了让构造函数返回一些东西会使构造函数有两件事而不只是一件事(这通常是一件不希望的事情),请注意构造函数不能被命名,因此不可能明确地调用它们。因为不可能构造一个表达式,这个表达式是对构造函数的显式调用,所以无论如何都不可能分配或引用构造函数的返回值。

试图从构造函数返回某些东西根本不符合语言设计。

构造函数不“返回”对象,它们初始化调用它们的内存区域中的对象。如果声明具有静态存储持续时间的类类型对象(并且该类型具有用户声明的构造函数),则该内存在程序的整个生命周期中保留,实现确保调用构造函数以初始化该位置的对象在该计划的适当时间。同样,如果声明了具有自动存储持续时间的对象并且该对象具有自动存储持续时间,则该实现会在每次执行声明语句时预留空间(非正式地称为某个堆栈空间)并调用构造函数。

对于新的表达式,内存是动态分配的,实现调用相应的构造函数来初始化对象。

请注意,如果X是一个类类型,则所有这些语句中的X始终引用该类型的名称,永远不会包含实际上没有名称的构造函数。声明或定义构造函数的语法是特殊的,并不意味着构造函数具有名称。假设X有一个用户声明的构造函数。

X x; // Initialize an object of type X using the default constructor 

X(); // Value initialize a temporary of type X. Not an explicit constructor call. 

new X(); // new expression: value-initialize a dynamically allocated X 

X(a); // A function style cast 

X(a, b); // Construct an X from the expression list. X must have a 
     // suitable constructor but the X still refers to the type. 
0

构造没有retunrn型bacause它已经为前返回refrence_id到refrence变量(被称为对象): - 的Emp E1 =新的Emp(refrence_id) 这里的Emp是CLASS_NAME E1是refrence变量 新的用于动态分配 的Emp()是类的Emp 在此构造函数构造函数返回refrence_id到refrence变量E1

相关问题