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

原创 2007年10月10日 17:07:00
 
在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)
本人的意见是构造函数是有返回值的,返回的就是新构造的对象本身,但是不能指定返回类型,因为你用这个类的构造函数表明就是返回这个类的一个对象,没有必要指定返回类型,即使是指定也必须是指定类本身的返回类型,这就多次一举了吧。
 

 

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

构造函数析构函数为什么没有返回值?   (Liupq 2008.5.10) 构造函数和析构函数是两个非常特殊的函数:它们没有返回值.这与返回值为void的函数显然不同.后者虽然也不返回任何值,但...
  • BigLeo
  • BigLeo
  • 2011年09月27日 11:48
  • 7657

构造函数有没有返回值?

昨天面试,他问我:构造函数有没有返回值? 我告诉他说:构造函数没有返回值。  他举了个反例:    String str = new String("content");  new 的...
  • ftx2540993425
  • ftx2540993425
  • 2016年05月17日 09:11
  • 6342

C++中class类 的 构造函数、析构函数

说明: demo.cpp:main.cpp所在之处 Line.h:线段类的.h文件 Line.cpp:线段类的.cpp文件 Coordinate.h:坐标类的.h文件 Coordinate.cpp:坐...
  • shangguanyunlan
  • shangguanyunlan
  • 2016年10月16日 17:05
  • 1528

构造函数失败

什么函数都有可能失败,构造函数也不另外,比如new一个对象或空间不成功。当构造函数失败的时候,其实很多时候我们不想这个对象被继续生成,这个时候就可以在构造函数里面抛出异常。C++规定构造函数抛出异常之...
  • wind19
  • wind19
  • 2012年11月22日 17:11
  • 4805

关于构造函数不能有返回类型的错误

今天写程序老是报错,错误error C2533: “ImageProcess::{ctor}”: 构造函数不能有返回类型,可是ImageProcess()构造函数本来就没写返回类型啊。检查的N久,最后...
  • sky_freebird
  • sky_freebird
  • 2011年08月15日 11:26
  • 7440

error C2533: “A::{ctor}”: 构造函数不能有返回类型

因为在头文件里的class后面忘记加  “ ; ”了
  • dongzhe8
  • dongzhe8
  • 2016年06月02日 15:52
  • 1359

c++构造函数不能有返回类型错误提示?解决方法!

43 class Point  44 {  45 public:  46     Point(int xx, int yy){X = xx; Y = yy;}//构造该函数  47     Point...
  • yuanlu837
  • yuanlu837
  • 2014年02月19日 17:35
  • 3634

c++解决 {ctor}构造函数不能有返回类型或者无故缺少“;”(在“using”的前面)的问题

今天出现以下问题: 1,首先,在以前从未出过错的一个头文件Common.h中(代码如下),第四行出现错误:缺少“;”(在“using”的前面)的问题#ifndef __GAME_COMMON_H_ ...
  • bark2003
  • bark2003
  • 2015年06月08日 18:38
  • 672

error C2533: “A::{ctor}”: 构造函数不能有返回类型

因为在头文件里的class后面忘记加  “ ; ”了
  • A_sungirl
  • A_sungirl
  • 2012年09月23日 13:07
  • 4088

C++编程隐蔽错误:error C2533: 构造函数不能有返回类型

C++编程隐蔽错误:error C2533: 构造函数不能有返回类型 今天在编写类的时候,出现的错误。 提示一个类的构造函数不能够有返回类型。 在cpp文件里,该构造函数定义处并没有返回类...
  • wqjsir
  • wqjsir
  • 2012年10月26日 10:11
  • 4744
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:在C++中,为什么构造函数不能有返回值?
举报原因:
原因补充:

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