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

marrco2005 2007-08-01 01:47:56
在C++中,为什么规定构造函数不能有返回值?这其中有没有什么原因?
...全文
5912 157 打赏 收藏 转发到动态 举报
写回复
用AI写文章
157 条回复
切换为时间正序
请发表友善的回复…
发表回复
zhaowei1334 2011-03-28
  • 打赏
  • 举报
回复
首先我来说一下,我是反汇编出来的,对不对还请各位纠正。

其实构造函数是有返回值的,而且返回值正是this指针。
langpp1 2010-05-12
  • 打赏
  • 举报
回复
想一下自己使用构造函数的方法吧,我用的比较多的是C#,用构造函数时候总会构造出我们所需要的对象,而使用时候他总是在等式右边,所以我一直理解为内部定义了其返回一个对象(Object)类型。所以强制规定我们的构造函数不能有返回值类型。否则类型冲突,创建不出我们需要的对象,构造函数就失去了它现在的价值了。
vcminusminus 2008-04-23
  • 打赏
  • 举报
回复
学习!
oldmanzhao 2007-11-24
  • 打赏
  • 举报
回复
这帖子好看,嗯!
xxuroo 2007-08-09
  • 打赏
  • 举报
回复
//app.h
class A
{
public:
A(){val=0;}
A(int v){val=v;}
private:
int val;
};
//app.cpp
main()
{
A x(); //1
A y(8);//2
}

我没有调用过构造函数。
即使这样的写法:
A x=A();//3
也不是在调用构造函数。
对象的创建是系统完成的,当我们写了1、2这样的代码的时候,编译器只是根据
我们写法去找一个合适的构造函数初始对象,至于对象的创建,跟构造函数无关。
编译器自然会制造一些代码去分配内存,填写虚函数地址等东西。
如果我们用了第3种写法,A()也不是在调用构造函数,它是一个表达式。
这个表达式让编译器明白,我们想创建对象,并且使用默认的构造函数去初始对象。

***要返回值干什么?不需要的话就不要返回了。
***
A x();这样的语句的目标在于创建对象,简单地得到内存块以及其它一些对对象来
说很必要的东西。换句话说,这种语句的失败意味着内存分配这样的错误。所以,构造
函数没有很必要给我们机会去报告其它错误。

如果需要为对象分配其它资源,去写init函数吧,它可以有返回值,它是函数。
canybox 2007-08-09
  • 打赏
  • 举报
回复
构造函数只是一个地方,这个地方用来完成对象初始化的事情,又返回值的话就成了一般的函数调用了
fish6344 2007-08-09
  • 打赏
  • 举报
回复
构造函数为什么不能返回值,这是语言规定的构造函数语意所决定的。

      大部分函数的执行可以有多选的执行结果,比如说成功执行、部份成功执行、抛出异常、完全失败以及返回N个可能的状态值等等。

但是构造函数的执行只能有两种结果,要么成功,对象得以被建构,要么失败,你想建构的对象根本就未曾出生过!如Herb Sutter博士强调的:“...重点在于:在(对象)生命期开始之前与生命期结束之后,对象的状态完全一样-没有对象存在。...”(见《More Exceptional C++》page118),这就是所谓的构造语意!所以它不能有返回值,永远不能有返回值,如果将来谁要让构造函数有返回值,也就改变了构造语意,那就是另一种语言了...
sentimentalyouth 2007-08-06
  • 打赏
  • 举报
回复
根据经验,不少难以察觉的程序错误是由于变量没有被正确初始化或清除造成的,而初始化和清除工作很容易被人遗忘。Stroustrup在设计C++语言时充分考虑了这个问题并很好地予以解决:把对象的初始化工作放在构造函数中,把清除工作放在析构函数中。当对象被创建时,构造函数被自动执行。当对象消亡时,析构函数被自动执行。这下就不用担心忘了对象的初始化和清除工作。
构造函数与析构函数的名字不能随便起,必须让编译器认得出才可以被自动执行。Stroustrup的命名方法既简单又合理:让构造函数、析构函数与类同名,由于析构函数的目的与构造函数的相反,就加前缀‘~’以示区别。
除了名字外,构造函数与析构函数的另一个特别之处是没有返回值类型,这与返回值类型为void的函数不同。构造函数与析构函数的使命非常明确,就象出生与死亡,光溜溜地来光溜溜地去。如果它们有返回值类型,那么编译器将不知所措。为了防止节外生枝,干脆规定没有返回值类型。(以上典故参考了文献[Eekel, p55-p56])
lgdgyd2 2007-08-06
  • 打赏
  • 举报
回复
mark下,以待复习
FFSB 2007-08-06
  • 打赏
  • 举报
回复
return *this&
yeyuboy 2007-08-06
  • 打赏
  • 举报
回复
有返回值也没用,你不好接收啊。

难道构造时:
returnvlaue = Object o;

析构时???
逸学堂 2007-08-06
  • 打赏
  • 举报
回复
1:关于构造函数无返回值,好像在<深入C++对象对象模型>中讨论过,
<深>主要讲编写编译器中如何实现C++语言的分析,所以我这里主要提到的是编写编译器时,为什么
要把构造函数设计成为无返回值形式
2:我的印象中构造函数无返回值有这么几点
1: 构造函数,并不是真正意义上的函数,其原因就是不满足函数特性,函数名,返回值,参数.并且
从严格意义上来说,构造函数不仅没有返回值,还没有名称,把构造函数定义为同类名相同,只是公认方法而已,这种方法并没有在C++标准中强制说明,非要使用此方法.
2: 函数的实现,任何函数的调用都必须有返回值,其原因就是返回到调用函数的点上,以便程序继续往下执行.而对象构造,只是初始化对象内数据的过程,至于初始化过程会不会产生错误,不应该有调用负责检查,所以也没有必要需要返回值
举一个简单例子
int i = 5;
i是C++内置数据类型,我们声明i,并把i初始值为5,在这个过程中i是不会返回任何值(哪怕是void),用来说明i创建情况的.同理对于c++中的一个类的构造也是这样的,如果这个构造过程和c++内置
数据类型的初始化不同,那么这个类是一个糟糕的设计.C++类对象的构造过程其实就是数据声明初始化的过程,对于数据声明初始化是不需要返回值
3: 如果构造函数存在返回值,那么就要求构造函数是一个确定的函数,但是当一个对象还没有创建的时候是调用这个对象的方法其行为是未定义的行为.所以必须对构造函数特殊处理,而不能把它当作一个普通的函数
4: 关于析构函数无返回值,参考
int i = 0;
当i退出作用域时,自动销毁,而不用判断i是否真的被销毁,析构函数也是同理,析构函数
只是销毁对象数据,不需要判断是否真正的被销毁.
5: 任何游戏都有规则,但是规则并不是随意制定的,都有其原因.可能是因为我们知识,经验等
原因使我们不能很好的理解这些规则.

以上是我简单的认识,不足之处多多包涵.





laoluo 2007-08-06
  • 打赏
  • 举报
回复
我强顶,步步文 和Taodm
他们说的对, 不信你去看,别人就有些钻牛角尖了
ChrisAK 2007-08-06
  • 打赏
  • 举报
回复
如果构造函数可以返回值,那

A *a = new A();

里的构造函数返回的值该要怎么取得?
不可能由new返回赋值给a吧?
rightyeah 2007-08-06
  • 打赏
  • 举报
回复
几个低手骂来骂去干什么?看不懂
tonyliu0401 2007-08-05
  • 打赏
  • 举报
回复
你想返回什么呢?构造嘛。。对不?
cxu2003 2007-08-05
  • 打赏
  • 举报
回复
1. 我并没看完所有回复
2. 楼主态度不好,但taodm 确实没有给出理想的答案.

我想了一下这个问题, 关键就在于设计者对构造函数的看法.

构造函数设计为被对象自身使用,而非供其他对象使用的一个接口.
vcnewer 2007-08-05
  • 打赏
  • 举报
回复
嘿,好看,
seysey 2007-08-04
  • 打赏
  • 举报
回复
牛帖
个人觉得晨星和杜康的不错
iamnst 2007-08-04
  • 打赏
  • 举报
回复
mark
加载更多回复(137)

64,654

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧