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

 

意见(1)

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

class A
{
public:
A();
~A();
public:
void f();
};
A
aa;此语句导致类A的构造函数A()被自动调用返回一个首地址,系统就在内存中分配一块区域用来存放对象aa。这个首地址就被赋给this.

意见(2)

返回的确实应该是 A& 类型,可以利用VC的一个bug证明这一点:
class A
{
public:
A() {
cout << "A: hello, world!"
<< endl;
}
};

class B:public A
{
public:
B() {
A& a = this -> A::A();
//这句不符合C++标准,但VC居然接受了。
}
};

void
main(void)
{
B b;
}

另外,我实在想不出这个返回只有什么用,编译器在进入构造函数之前就知道this的值了,然后构造函数又返回了一个*this,而且VC至少是忽略掉这个返回值的。

意见(3)

规范规定构造函数没有返回值。

意见(4)

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

最新文章

  1. 天津政府应急系统之GIS一张图(arcgis api for flex)讲解(十二)水情雨情模块
  2. Windows光标形状
  3. 如何更改IP地址的映射名字
  4. C- struct的使用
  5. 转:使用memc-nginx和srcache-nginx模块构建高效透明的缓存机制
  6. ThoughtWorks(中国)程序员读书雷达 —— 书籍下载整理
  7. WEB Application Development Integrator : 应用设置
  8. javaEE jdbc编程步骤
  9. 读书笔记 effective c++ Item 24 如果函数的所有参数都需要类型转换,将其声明成非成员函数
  10. yum 安装vim编辑器
  11. sqlserver删除重复的数据
  12. MySQL“Another MySQL daemon already running with the same unix socket” 报错信息处理
  13. centos 7 selinux开启关闭
  14. python操作注册表
  15. Redis的工作流程
  16. config、option、setting辨析
  17. I - 取石子游戏
  18. 在开发node.js中,关于使用VS2013插件出现一直读取资源的问题
  19. jq 获取当前屏幕高度
  20. java 表单验证

热门文章

  1. AppServer初始化渠道
  2. 玩转webpack之webpack的基本知识
  3. mybatis深入理解(八)-----关联表查询
  4. Python学习笔记(六)Python组合数据类型
  5. neo4j中对节点关系和聚类的思考
  6. php百度地图计算两地现实距离
  7. Leetcode665.Non-decreasing Array非递减数组
  8. WPF学习(8)数据绑定 https://www.cnblogs.com/jellochen/p/3541197.html
  9. go 文件操作 io
  10. 模拟退火解TSP问题MATLAB代码