社区
C++ 语言
帖子详情
在C++中,为什么构造函数不能有返回值?
marrco2005
2007-08-01 01:47:56
在C++中,为什么规定构造函数不能有返回值?这其中有没有什么原因?
...全文
5912
157
打赏
收藏
在C++中,为什么构造函数不能有返回值?
在C++中,为什么规定构造函数不能有返回值?这其中有没有什么原因?
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用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)
1.为什么
构造函数
不能
有
返回值
?
构造函数
的调用之所以不设
返回值
,是因为
构造函数
的特殊性决定的。从基本语义角度来讲,
构造函数
返回的应当是所构造的对象。否则,我们将无法使用临时对象: ::如果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++
中
的
构造函数
: 最近在面试
中
问道一个问题,
C++
中
构造函数
有
返回值
吗? 例如 class A { public: A():x(1){} A(int i):x(i){} private: int x; } 官方解释在
C++
标准规定了构造/析构/自定义类型转换符不可以指定返回类型。 如果
构造函数
有
返回值
比如下:有
返回值
且
返回值
为int类型; //若
构造函数
有参数 int A():x_...
构造函数
有没有
返回值
?
昨天面试,他问我:
构造函数
有没有
返回值
? 我告诉他说:
构造函数
没有
返回值
。 他举了个反例: String str = new String("content"); new 的时候调用
构造函数
,返回给str; 再问:有没有方法确定知道
构造函数
有没有返回?? 这是 上的说法: For purposes other than simple initializ
关于
构造函数
没有
返回值
的问题
为什么
构造函数
不能
有
返回值
? 摘自 > “
构造函数
是一种很特殊的函数,因为他没有
返回值
。这和‘
返回值
为void’有极大的差别。返回void时,一般函数并不返回任何东西,但是一般的函数能够选择是否要返回些什么东西。
构造函数
则绝对不返回任何东西,而且你也没有任何选择。如果它有一个
返回值
,而且你有权利选择你自己的返回型别(return type),编译器势必得通过某种方式来知道如何处理那个
构造函数
析构函数为什么没有
返回值
?
构造函数
析构函数为什么没有
返回值
? (Liupq 2008.5.10)
构造函数
和析构函数是两个非常特殊的函数:它们没有
返回值
.这与
返回值
为void的函数显然不同.后者虽然也不返回任何值,但还可以让它做点别的事情,而
构造函数
和析构函数则不允许.在程序
中
创建和消除一个对象的行为非常特殊,就像出生和死亡,而且总是由编译器来调用这些函数以确保它们被执行.如果它们有
返回值
,要么编译器必须知道如何处理
返回值
,...
C++ 语言
64,654
社区成员
250,484
社区内容
发帖
与我相关
我的任务
C++ 语言
C++ 语言相关问题讨论,技术干货分享,前沿动态等
复制链接
扫一扫
分享
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++
技术论坛(原bbs)
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
请不要发布与C++技术无关的贴子
请不要发布与技术无关的招聘、广告的帖子
请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下
试试用AI创作助手写篇文章吧
+ 用AI写文章