C++ 对象的隐式转换。

Balancer 2013-01-29 02:48:30
我用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被析构掉

我的问题是红颜色的文字部分,谢谢。
...全文
257 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
Balancer 2013-01-29
  • 打赏
  • 举报
回复
引用 9 楼 mymtom 的回复:
C/C++ code?12345678910111213// 楼主好好看看c++ primer// 赋值操作符的形式是// 注意 constTYPE& TYPE::operator=(const TYPE& rhs){ // ... return *this;} // 拷贝构造函数的形式为TYPE::TYPE(const TYPE& v……
------------------------------------------------------------ 谢谢指点。
mymtom 2013-01-29
  • 打赏
  • 举报
回复
// 楼主好好看看c++ primer
// 赋值操作符的形式是
// 注意 const
TYPE& TYPE::operator=(const TYPE& rhs)
{
    // ...
    return *this;
}

// 拷贝构造函数的形式为
TYPE::TYPE(const TYPE& val)
{
}

Balancer 2013-01-29
  • 打赏
  • 举报
回复
此贴已结,答案如五楼所言。
Balancer 2013-01-29
  • 打赏
  • 举报
回复
引用 5 楼 mymtom 的回复:
引用 3 楼 lefter1986 的回复:a = 27; 我想象中的执行结果是: 构造函数被执行。 --- 创建临时对象:Human(27) 复制构造函数被执行。 --- 调用对象a的复制构造函数将Human(27)复制给a 这里其实用的是赋值操作符 析构函数被执行。 --- 析构Human(……
--------------------------------------------------------------------- 谢谢您的回答,长知识了。
Balancer 2013-01-29
  • 打赏
  • 举报
回复
引用 2 楼 bravery36 的回复:
除了拷贝构造函数,还有'='可以赋值,你重载一下等号就能看到了。

----------------------------------------------------------------------
如你所言,加上如下函数:

void operator= (Human& man)
{
m_nAge = man.m_nAge;
m_nHeight = man.m_nHeight;
cout << "赋值操作符被调用" << endl;
}

输出结果就是:


但需要将a = 27; 替换成 a = Human(27); 否则编译不过。

个人猜测未重载等号操作符之前,用a = 27;能够编译通过的原因:
编译器将a = 27优化成a = Human(27);然后调用默认的等号操作符。
mymtom 2013-01-29
  • 打赏
  • 举报
回复
引用 3 楼 lefter1986 的回复:
a = 27; 我想象中的执行结果是: 构造函数被执行。 --- 创建临时对象:Human(27) 复制构造函数被执行。 --- 调用对象a的复制构造函数将Human(27)复制给a 这里其实用的是赋值操作符 析构函数被执行。 --- 析构Human(27)
初始化的时候,或者显示调用,才会调用复制构造函数

Foo f1;          // 无参数的构造函数
Foo f2(f1);      // 复制构造函数
Foo f3 = f2;     // 复制构造函数
f3 = f1;         // 赋值操作符
mymtom 2013-01-29
  • 打赏
  • 举报
回复
Human(Human& man) => Human(const Human& man) 这才是复制构造函数
Balancer 2013-01-29
  • 打赏
  • 举报
回复
a = 27; 我想象中的执行结果是: 构造函数被执行。 --- 创建临时对象:Human(27) 复制构造函数被执行。 --- 调用对象a的复制构造函数将Human(27)复制给a 析构函数被执行。 --- 析构Human(27)
bravery36 2013-01-29
  • 打赏
  • 举报
回复
除了拷贝构造函数,还有'='可以赋值,你重载一下等号就能看到了。
gaoqijie 2013-01-29
  • 打赏
  • 举报
回复
mark 下,看回复。

64,691

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧