VC驿站

 找回密码
 加入驿站

QQ登录

只需一步,快速开始

搜索
查看: 203|回复: 3

[交流] 重载=,调用的却是拷贝构造函数

[复制链接]
46_avatar_middle
最佳答案
4 
在线会员 发表于 2022-4-8 23:28:48 | 显示全部楼层 |阅读模式
重载=,调用的却是拷贝构造函数 #include <iostream>
using namespace std;

class Person
{
public:
        Person(int age)
        {
                m_Age = new int(age);
        }

        int* m_Age;

        ~Person()
        {
                if(m_Age != NULL)
                {
                        delete m_Age;
                        m_Age = NULL;
                        cout << "调用析构函数,释放m_Age完毕" << endl;
                }
        }

        Person(const Person& p)
        {
                cout << "调用拷贝构造函数" << endl;
                m_Age = new int(*p.m_Age);
        }

        Person& operator=(Person& p)
        {
                cout << "调用=操作符" << endl;
                if(m_Age != NULL)
                {
                        //如果已经在堆区分配内存,先释放
                        delete m_Age;
                        m_Age = NULL;
                }
                //将赋值的对象,深拷贝给被赋值对象
                m_Age = new int(*p.m_Age);
                return *this;
        }
};

void test01()
{
        Person p1(108);
        Person p2 = p1;
        cout << "p1 age: " << *p1.m_Age << endl;
        cout << "p2 age: " << *p2.m_Age << endl;
}

int main()
{
        test01();
        system("pause");
        return 0;
}

Person p2 = p1; 这一句为何是调用的拷贝构造函数,而不是重载的=运算符?
被编译器优化了吗?十分好奇!




上一篇:求Codejock.Xtreme.Toolkit.Pro.v15.3.1源码
下一篇:如何在dll动态库中绑定MFC CListCtrl类型的控件类型变量到m_List
17_avatar_middle
最佳答案
39 
在线会员 发表于 2022-4-9 09:57:08 | 显示全部楼层
  1. //重载
  2. Person p2;//这个在你这边不能直接用,你没有默认构造函数。你改成Person p2={2};
  3. p2= p1; //这样才是重载,
复制代码
46_avatar_middle
最佳答案
4 
ico_lz  楼主| 发表于 2022-4-9 12:51:47 | 显示全部楼层

好的,先有对象,才能再赋值。
那么Person p2 = p1 这个怎么理解呢?等价于Person p2(p1)吗?因为这句实际上调用了拷贝构造函数,所以我推导出是这样子
17_avatar_middle
最佳答案
39 
在线会员 发表于 2022-4-9 12:56:15 | 显示全部楼层
本帖最后由 yoobaby 于 2022-4-9 12:57 编辑
CIA 发表于 2022-4-9 12:51
好的,先有对象,才能再赋值。
那么Person p2 = p1 这个怎么理解呢?等价于Person p2(p1)吗?因为这句实 ...


C++中三种情况下会调用拷贝构造函数:

*【这个】使用一个已经创建完毕的对象来初始化另一个新对象。

值传递的方式给函数参数传值。
以值方式返回局部对象。

Point pt2 = pt1; //等价于Point pt2(pt1),调用拷贝构造函数
您需要登录后才可以回帖 登录 | 加入驿站 qq_login

本版积分规则

×【发帖 友情提示】
1、请回复有意义的内容,请勿恶意灌水;
2、纯数字、字母、表情等无意义的内容系统将自动删除;
3、若正常回复后帖子被自动删除,为系统误删的情况,请重新回复其他正常内容或等待管理员审核通过后会自动发布;
4、感谢您对VC驿站一如既往的支持,谢谢合作!

关闭

站长提醒上一条 /2 下一条

QQ|小黑屋|手机版|VC驿站 ( 辽ICP备09019393号-4 )|网站地图wx_jqr

GMT+8, 2022-11-30 11:14

Powered by CcTry.CoM

© 2009-2021 cctry.com

快速回复 返回顶部 返回列表