一件很神奇的事情,为什么一个对象竟可以调用两次构造函数??!!

废话不说,先上代码



C/C++ code


#include<iostream>
using namespace std;

class A{
float x,y;
public:
    A(){cout<<"调用默认构造函数"<<endl;}
    A(float a){x=a;y=0;cout<<"单参数构造函数"<<endl;}
    A(float a,float b){x=a;y=b;cout<<"2参数构造函数"<<endl;}
    A(A& a){x=a.x;y=a.y;cout<<"copy 构造函数"<<endl;}

};

int main()
{
A a0;
a0=2+3;



    return 0;
    }







这个例子中
只有一个对象a0,
但是输出了

调用默认构造函数
单参数构造函数

并且单步调试 发现 a0=2+3;
之后 a0的 x 值变成了5

说明调用了两次构造函数!!!!!惊讶!!!

可以有人解释一下为什么会调用两次呢??
并且 这个 等号= 的工作机制是什么啊?  
为什么a0的x会变成5?

作者: zz457887107   发布时间: 2011-06-14

a0=2+3;
2+3等于5,用5调用 A(float a)构造函数构造一个临时对象temp,然后将temp赋给a0,赋值的时候使用缺省的赋值运算符,即位拷贝。

作者: dizuo   发布时间: 2011-06-14

楼上正解,顶

作者: autumn_xl   发布时间: 2011-06-14

引用 1 楼 dizuo 的回复:

a0=2+3;
2+3等于5,用5调用 A(float a)构造函数构造一个临时对象temp,然后将temp赋给a0,赋值的时候使用缺省的赋值运算符,即位拷贝。


++
严格地说,a0=2+3;这样的写法会调用Copy assignment operator

作者: pathuang68   发布时间: 2011-06-14

看过留名,没看懂- =~~~菜鸟飞过。。。

作者: Libylovexixi   发布时间: 2011-06-14

引用 1 楼 dizuo 的回复:
a0=2+3;
2+3等于5,用5调用 A(float a)构造函数构造一个临时对象temp,然后将temp赋给a0,赋值的时候使用缺省的赋值运算符,即位拷贝。


学习了

作者: sanshao1314   发布时间: 2011-06-14

临时变量

作者: nwpucoder   发布时间: 2011-06-14

位拷贝是什么东东?

作者: zhy905692718   发布时间: 2011-06-15