在C++中,为什么构造函数不能有返回值?

转载 2012年03月31日 15:42:59

可以return,但不能指定返回值。

------------------------------------


 
在C++中,为什么构造函数不能有返回值?
 
 
(1)假设有一个类C,有如下定义:
class C
{
public:
   C():x_(0) {}
   C(int i):x_(i) {}
private:
   int x_;
};
如果C的构造函数可以有返回值,比如int:
   int C():x_(0) { return 1; //1表示构造成功,0表示失败}
那么下列代码会发生什么事呢?
C c=C(); //此时c.x_==1!
很明显,C()调用了C的无参数构造函数。该构造函数返回int值1。恰好C有一个但参数构造函数C(int i)。于是,混乱来了。按照C++的规定,C c=C();是用默认构造函数创建一个临时对象,并用这个临时对象初始化c。此时,c.x_的值应该是0。但是,如果C::C()有返回值,并且返回了1(为了表示成功),则C++会用1去初始化c,即调用但参数构造函数C::C(int i)。得到的c.x_便会是1。于是,语义产生了歧义。使得C++原本已经非常复杂的语法,进一步混乱不堪。
构造函数的调用之所以不设返回值,是因为构造函数的特殊性决定的。从基本语义角度来讲,构造函数返回的应当是所构造的对象。否则,我们将无法使用临时对象:
void f(int a) {...}      //(1)
void f(const C& a) {...} //(2)
f(C()); //(3),究竟调用谁?
对于(3),我们希望调用的是(2),但如果C::C()有int类型的返回值,那么究竟是调(1)好呢,还是调用(2)好呢。于是,我们的重载体系,乃至整个的语法体系都会崩溃。
这里的核心是表达式的类型。目前,表达式C()的类型是类C。但如果C::C()有返回类型R,那么表达式C()的类型应当是R,而不是C,于是便会引发上述的类型问题。
 
 
 
 
(2)只是C++标准规定了构造/析构/自定义类型转换符不可以指定返回类型。
但你不能据此就说它们没有返回类型。
 
 
(3)
本人的意见是构造函数是有返回值的,返回的就是新构造的对象本身,但是不能指定返回类型,因为你用这个类的构造函数表明就是返回这个类的一个对象,没有必要指定返回类型,即使是指定也必须是指定类本身的返回类型,这就多次一举了吧。



本文转自:http://blog.csdn.net/tangaowen/article/details/1818819

相关文章推荐

C++返回值为对象时复制构造函数不执行怎么破

先说点背景知识,调用复制构造函数的三种情况:  1.当用类一个对象去初始化另一个对象时。  2.如果函数形参是类对象。  3.如果函数返回值是类对象,函数执行完成返回调用时。  在辅导学生上机时,有同...

return C++构造函数的返回值

看到这个标题估计大家都很诧异,C++构造函数是没有返回值

C++中拷贝构造函数的调用与C++返回值优化

C++ 拷贝构造函数 深拷贝 浅拷贝

『C/C++』C++构造函数无返回值,如何判断对象是否“构造”成功?

原文地址:C++构造函数无返回值,如何判断对象是否“构造”成功? 一道面试题,答案可能不惟一: C++构造函数无返回值,如何判断对象是否“构造”成功?  注意:这里的“构造”不是单指分配...

构造函数有没有返回值

疑问在于如下的代码: String str = new String(content); new 的时候调用构造函数,返回给str; 从语法上讲,构造函数不允许有返回值,就算是 void ...

Java构造函数到底有没有返回值?

Java构造函数到底有没有返回值?

Android构造函数有没有返回值?

有个朋友去面试给我们分享的面试题……面试官问:安卓构造函数有没有返回值?朋友答:没有面试官再问:为啥构造函数没有返回值?有没有文献或者方法证明没有返回值?朋友答:……(我有句话不知当讲不当讲,算了没忍...

构造函数的返回值

鲜为人知的C++构造函数

为什么构造函数没有返回值?

意见(1) 我认为构造函数隐含的返回值就是this,因为构造函数是在类的对象产生时自动调用。构造函数被调用也就意味着产生了一个对象,而this指针是与对象实体相关联的,所以我认为它返回的就是this...

java构造函数有没有返回值的总结

这个问题已经有人讨论过,最近在Java版再次被人提出来了。 疑问在于如下的代码: String str = new String(content); new 的时候调用构造函数,返回给str; ...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:在C++中,为什么构造函数不能有返回值?
举报原因:
原因补充:

(最多只允许输入30个字)