C++ 对象的隐式变换

C++ 对象的隐式转换。
本帖最后由 lefter1986 于 2013-01-29 15:05:04 编辑
我用Visual Studio 2008编写如如下代码:
#include <iostream>
using namespace std;

class Human
{
public:
Human(int nAge)
{
m_nAge = nAge;
m_nHeight = 183;
cout << "构造函数被执行" << endl;
}

Human(Human& man)
{
m_nAge = man.m_nAge;
m_nHeight = man.m_nHeight;
cout << "复制构造函数被执行" << endl;
}

~Human()
{
cout << "析构函数被执行" << endl;
}

void Print()
{
cout << m_nAge << "\t" << m_nHeight << endl;
}

private:
int m_nAge;
int m_nHeight;
};

int main()
{
Human a(26);
a.Print();
a = 27;
a.Print();
return 0;
}

相关代码与执行结果的对应关系如下:
Human a(26);      //  构造函数被执行
a.Print();        //  26    183
a = 27;           //  构造函数被执行 析构函数被执行,相当于a = Human(27),但是没有调用复制构造函数,为什么?
a.Print();        //  27     183
return 0;         //  析构函数被执行,对象a被析构掉

我的问题是红颜色的文字部分,谢谢。

------解决方案--------------------
除了拷贝构造函数,还有'='可以赋值,你重载一下等号就能看到了。
------解决方案--------------------
引用:
a = 27;
我想象中的执行结果是:
构造函数被执行。     --- 创建临时对象:Human(27)
复制构造函数被执行。 --- 调用对象a的复制构造函数将Human(27)复制给a 
                         这里其实用的是赋值操作符
析构函数被执行。     --- 析构Human(27)


初始化的时候,或者显示调用,才会调用复制构造函数

Foo f1;          // 无参数的构造函数
Foo f2(f1);      // 复制构造函数
Foo f3 = f2;     // 复制构造函数
f3 = f1;         // 赋值操作符