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

 

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

【C++】为什么构造函数没有返回值?(转载)的更多相关文章

  1. C++ 赋值构造函数的返回值到底有什么用?且返回值是否为引用类型有什么区别吗?

    首先定义类Person class Person{ public: string name; Person()=default; //默认构造函数 Person(string nam):name(na ...

  2. Javascript中构造函数的返回值问题和new对象的过程

    首先明确一点:javascript中构造函数是不需要有返回值的,这一点跟java很类似.可以认为构造函数和普通函数的最大差别就是:构造函数中没有return语句,普通函数可以有return语句:构造函 ...

  3. 关于socket阻塞与非阻塞情况下的recv、send、read、write返回值(转载)

    1.阻塞模式与非阻塞模式下recv的返回值各代表什么意思?有没有区别?(就我目前了解阻塞与非阻塞recv返回值没有区分,都是 <0:出错,=0:连接关闭,>0接收到数据大小,特别:返回值  ...

  4. javascript设计模式和构造函数返回值

    工厂模式 function createPerson(name,age,job){ var o = new Object(); o.name = name; o.age = age; o.job = ...

  5. c++赋值构造函数为什么返回引用类型?

    目录 0 前言 1 内置类型 2 自定义类型 3 结论 4 源码 0. 前言 c++默认赋值构造函数的返回值是引用类型,c++赋值运算符=的本意是返回左值的引用,我们重载赋值构造函数的时候,返回值是否 ...

  6. 转载:C++函数中new一块内存,作为返回值

    转载来自:http://blog.itpub.net/7728585/viewspace-2123621/ 今天遇到一个问题,C++编程时,函数中new一块内存,然后将申请内存的指针作为返回值.怎么d ...

  7. (转载)mysql_query( )返回值

    (转载)http://hi.baidu.com/tfbzccqceabfhyd/item/bd01db9f8995204af04215e4 调用mysql_query( ),当查询操作是update. ...

  8. 简单介绍如何使用PowerMock和Mockito来mock 1. 构造函数 2. 静态函数 3. 枚举实现的单例 4. 选择参数值做为函数的返回值(转)

    本文将简单介绍如何使用PowerMock和Mockito来mock1. 构造函数2. 静态函数3. 枚举实现的单例4. 选择参数值做为函数的返回值5. 在调用mock出来的方法中,改变方法参数的值 一 ...

  9. 定义一个复数(z=x+iy)类Complex,包含: 两个属性:实部x和虚部y 默认构造函数 Complex(),设置x=0,y=0 构造函数:Complex(int i,int j) 显示复数的方法:showComp()将其显示为如: 5+8i或5-8i 的形式。 求两个复数的和的方法:(参数是两个复数类对象,返回值是复数类对象)public Complex addComp(Compl

    因标题框有限,题目未显示完整,以下再放一份: 定义一个复数(z=x+iy)类Complex,包含: 两个属性:实部x和虚部y 默认构造函数 Complex(),设置x=0,y=0 构造函数:Compl ...

随机推荐

  1. JAVA面试常见问题之设计模式篇

    1.常见的设计模式 单例模式.工厂模式.建造模式.观察者模式.适配器模式.代理模式.装饰模式. 参考:https://www.cnblogs.com/cr330326/p/5627658.html 2 ...

  2. c++设计模式:访问者模式(visitor模式)

    1.c语言中回调基本都过函数指针来完成.c++中主要通过接口的方式完成回调.而visitor就是实现接口回调的一种方式. 1.首先定义个一个接口visitor类, class classVisitor ...

  3. Django项目:CRM(客户关系管理系统)--44--36PerfectCRM实现King_admin密码修改

    # king_urls.py # ————————02PerfectCRM创建ADMIN页面———————— from django.conf.urls import url from king_ad ...

  4. SSM7-nginx的反向代理和负载均衡

    1. 反向代理 1.1. 什么是反向代理 正向代理 反向代理: 反向代理服务器决定哪台服务器提供服务. 返回代理服务器不提供服务器.也是请求的转发. 1.2. Nginx实现反向代理 两个域名指向同一 ...

  5. 20190716-T1-礼物

    呵呵,我暴力WA了 这个题充分考验了大家对数学的理解(麦蒙大多在胡诌) 但是确实如此啊. 看数据范围想状压.(我额嗯嗯想到暴力?) 然后设出一个可爱的$dp$式(主语当然不是我,是出题人大佬) $f_ ...

  6. 读书笔记--Head First Ajax 目录

    1.使用Ajax 2.设计Ajax 3.javascripte事件 4.多个事件处理程序 5.异步应用 6.文档对象模型 7.管理DOM 8.框架与工具包 9.xml请求与响应 10.json 11. ...

  7. 删除 java代码中所有的注释

    删除 java代码中所有的注释.java public class CleanCommons { private static Pattern pattern = Pattern.compile(&q ...

  8. 深入理解PHP类的自动载入机制方法

    第一种情况:文件A.php中内容如下 <?phpclass A{ public function __construct(){ echo 'fff'; }}?> 文件C.php 中内容如下 ...

  9. php分页查询的简单实现代码

    <body><h1>分页查询</h1><?phpinclude("DADB.class.php");$db=new DADB();$tj= ...

  10. Oracle存储1.1

    1.生成一个表的简单sql语句 CREATE OR REPLACE PROCEDURE proc_AutoGenerateSQL(  tableName   VARCHAR2 ,--参数 需要操作的表 ...