类和对象–C++运算符重载
C++ 预定义的运算符,只能用于基本数据类型的运算,不能用于对象的运算
如何使运算符能用于对象之间的运算呢
赋值运算符重载
1.一般的赋值运算
int a = 10;
int b = 20;
int c = 30;
c = b = a;
cout << "a = " << a << endl;
cout << "b = " << b << endl;
cout << "c = " << c << endl;
运行结果:
2.赋值运算符重载
(1)为什么程序会崩溃?
首先创建对象 p1 和 p2 ,通过运算符 new 分别从内存中动态分配一块空间,将年龄数据分配到堆区,指针指向内存空间
当p2=p1时,因为没有用户自定义的赋值运算符函数,于是调用默认的赋值运算符函数,使两个对象 p1 和 p2 的指针都指向 new 开辟的同一个空间 18
主程序结束,要用析构函数释放内存,p2释放了一次内存,p1继续想释放同一块内存,同一块内存释放两次,导致程序崩溃。
编译器提供的代码是浅拷贝 m_age = p.m_age;
所以,我们要提供深拷贝,重新开辟一段内存空间,解决浅拷贝的问题
(2)解决方案:利用赋值运算符的重载
需要判断是否有属性在堆区,如果有,先释放干净
全部代码:
#include <iostream>
using namespace std;
class Person{
public:
Person(int age){//将年龄数据开辟到堆区,堆区:由程序员开辟,由程序员手动释放
m_Age = new int(age);
}
Person& operator=(Person& p){
if (m_Age != NULL){
delete m_Age;
m_Age = NULL;
}
m_Age = new int(*p.m_Age);//深拷贝 *p.m_Age:解引用,解出来是18
return *this;//返回自身
}
~Person(){
if (m_Age != NULL){
delete m_Age;
m_Age = NULL;
}
}
int* m_Age;
};
void test()
{
Person p1(18);
Person p2(20);
Person p3(30);
p3 = p2 = p1; //赋值操作
cout << "p1的年龄为:" << *p1.m_Age << endl;//*p1.m_Age 解引用的操作
cout << "p2的年龄为:" << *p2.m_Age << endl;
cout << "p3的年龄为:" << *p3.m_Age << endl;
}
int main() {
test();
system("pause");
return 0;
}