在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++中,为什么构造函数不能有返回值?

 在C++中,为什么构造函数不能有返回值?   (1)假设有一个类C,有如下定义:class C{public:   C():x_(0) {}   C(int i):x_(i) {}private: ...
  • tangaowen
  • tangaowen
  • 2007年10月10日 17:07
  • 9360

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
  • 3687

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

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

为什么C++构造函数不能有返回值

本文转载自http://baike.renwuyi.com/2014-12/4717.html    首先我们先看一下C程序的返回值处理情况,我们知道当C函数返回int等小型数据时直接将返回值放入ea...
  • ys20111016
  • ys20111016
  • 2017年03月26日 13:49
  • 86

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

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

C++编译出现 错误 1 error C2533: “TA::{ctor}”: 构造函数不能有返回类型

C++编译出现    错误 1 error C2533: “TA::{ctor}”: 构造函数不能有返回类型 class TA:public grudate,public teach...
  • fn0723
  • fn0723
  • 2016年03月23日 20:42
  • 1501

使用Out参数返回数据

using System;namespace test01{ class Program {  public static void Main(string[] args)  {    int i=2...
  • xialihua1023
  • xialihua1023
  • 2010年04月10日 21:22
  • 163

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

看到这个标题估计大家都很诧异,C++构造函数是没有返回值
  • happen23
  • happen23
  • 2014年11月01日 16:43
  • 2612

【读书笔记】Effective C++-2 构造/析构/赋值运算(之四)

Effective C++读书笔记 --By Nathan.Yu 2007-11-24-- 2 构造/析构/赋值运算(之四) 条款08:别让异常逃离析构函数 C++并不禁止析构函数吐出异常,但...
  • yhmhappy2006
  • yhmhappy2006
  • 2007年11月30日 00:09
  • 621

接口为什么不能有构造函数

下面比较一下两者的语法区别: 1.抽象类可以有构造方法,接口中不能有构造方法。 2.抽象类中可以有普通成员变量,接口中没有普通成员变量 3.抽象类中可以包含非抽象的普通方法,接口中的...
  • fyifei0558
  • fyifei0558
  • 2016年05月12日 10:53
  • 1657
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:在C++中,为什么构造函数不能有返回值?
举报原因:
原因补充:

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