您的位置:首页 > 编程语言 > C语言/C++

构造函数的返回值

2016-04-08 10:24 337 查看
今天看到同学们在讨论一个问题,这个问题是知乎上的一个问题,问题描述如下:

class A
{
public:
A(){}
};

int main()
{
A a = A(); //what is returned by A() here, why?
}

这个问题很有意思的,A的构造函数里面什么都没有,那么返回一个怎么样的对象呢,还是会出错呢?

显然这个程序是能够编译通过的,但是我们该怎么认识它呢,我们来看看反汇编吧。



可以看到:在call调用构造函数之前,黄色箭头的指向,此时已经有了一个对象了,没有调用构造函数之前就有了一个对象,原来是这样,A a = A()该返回什么呢,是这个在构造函数之前已经生成的对象吗?我们需要验一下它的身份。

#include <iostream>
using namespace std;

class A
{
public:
A()
{
val = 1;
}
void Showval()
{
cout << val << endl;
}
public:
int val;
};

int main()
{
A().Showval();
return 0;
}

我们写了上述代码,运行结果如下:



可以得到结果为1,所以我们可以推测A()确实返回了一个对象,是一个匿名对象。

我们可以继续验证一下这个对象的属性,我们在main函数里卖弄加上一个语句,如下:

int main()
{
A().Showval();
A().val = 2;
return 0;
}

运行的时候结果如下:



赋值无法通过,可以知道上面那个匿名对象是个临时对象(具有常性),所以才无法赋值。

 到了这里我们可以得出结论了:我们所讨论的A()的返回值没有意义,因为它是在调用构造函数之前就创造出来了,而不是构造函数的返回值。但是从整体角度看的话,我们可以说它返回的是一个匿名对象的引用。

好了,这个问题已经水落石出了,最后说明一下这个问题是大家一起努力的结果,而不是我一个解决的,功劳属于每一个参与问题讨论的人!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  C++