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被析构掉

我的问题是红颜色的文字部分,谢谢。
...全文
214 10 点赞 打赏 收藏 举报
写回复
10 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
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 下,看回复。
  • 打赏
  • 举报
回复
相关推荐
发帖
C++ 语言
加入

6.0w+

社区成员

C++ 语言相关问题讨论,技术干货分享,前沿动态等
申请成为版主
帖子事件
创建了帖子
2013-01-29 02:48
社区公告
暂无公告