C++Note 运算符重载 赋值
赋值运算符重载
C++编译器至少给一个类添加4个函数
1.默认构造函数(无参,函数体为空)
2.默认析构函数(无参,函数体为空)
3.默认拷贝构造函数,对属性进行值拷贝
4.赋值运算符 operator= ,对属性进行值拷贝(可能有深浅拷贝问题)
如果类中属性指向堆区(程序员自己开辟释放管理的区域),做赋值操作时也会出现深浅拷贝的问题
1 #include <iostream> 2 using namespace std; 3 //赋值运算符重载 4 class Person 5 { 6 public: 7 Person(int age) 8 { 9 m_Age = new int(age); 10 } 11 ~Person() 12 { 13 if (m_Age != NULL) 14 { 15 delete m_Age; 16 m_Age = NULL; 17 } 18 } 19 Person& operator=(Person& p)//返回值为空 不能实现 连续等于 例 c=b=a; 20 { 21 //m_Age = p.m_Age;//编译器提供的浅拷贝 22 //应该先判断是否有属性在堆区 如果有先释放干净 然后再深拷贝 23 if (m_Age != NULL) 24 { 25 delete m_Age; 26 m_Age = NULL; 27 } 28 m_Age = new int(*p.m_Age);//深拷贝操作 29 return *this;//实现连续赋值 30 } 31 int* m_Age; 32 }; 33 void test() 34 { 35 Person p1(18); 36 Person p2(20); 37 Person p3(21); 38 p2 = p1;//赋值 深浅拷贝问题 39 p3 = p2 = p1;//连续赋值 40 cout << "p1的年龄:" << *p1.m_Age << endl; 41 cout << "p2的年龄:" << *p3.m_Age << endl; 42 } 43 int main() 44 { 45 test(); 46 system("pause"); 47 return 0; 48 }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· .NET10 - 预览版1新功能体验(一)