C++ 赋值运算符重载
一、概念:
c++ 编译器至少给一个类添加4个函数
- 默认构造函数(无参,函数体为空)
- 默认析构函数(无参,函数体为空)
- 默认拷贝构造函数,对属性进行值拷贝
- 赋值运算符 operator=, 对属性进行值拷贝
如果类中有属性指向堆区,做赋值操作时,也会出现深浅拷贝的问题
二、示例
1、浅拷贝
#include <iostream>
#include <string>
using namespace std;
class Persion
{
public:
Persion(int age)
{
m_pAge = new int(age);
}
int *m_pAge;
};
void test01()
{
Persion p1(18);
cout << "p1的年龄为:" << *p1.m_pAge << endl; // 18
Persion p2(20);
cout << "p2的年龄为:" << *p2.m_pAge << endl; // 20
p1 = p2;
cout << "p1的年龄为:" << *p1.m_pAge << endl; // 20
cout << "p2的年龄为:" << *p2.m_pAge << endl; // 20
}
int main()
{
test01();
system("pause");
return 0;
}
释放内存会出问题:
#include <iostream>
#include <string>
using namespace std;
class Persion
{
public:
Persion(int age)
{
m_pAge = new int(age);
}
// 加入析构函数 程序奔溃
~Persion()
{
if (m_pAge)
{
delete m_pAge;
m_pAge = nullptr;
}
}
int *m_pAge;
};
void test01()
{
Persion p1(18);
cout << "p1的年龄为:" << *p1.m_pAge << endl; // 18
Persion p2(20);
cout << "p2的年龄为:" << *p2.m_pAge << endl; // 20
p1 = p2;
cout << "p1的年龄为:" << *p1.m_pAge << endl; // 20
cout << "p2的年龄为:" << *p2.m_pAge << endl; // 20
}
int main()
{
test01();
system("pause");
return 0;
}
浅拷贝会导致程序奔溃,原因是m_pAge 这个指针释放了2次,那么怎么解决呢?
使用深拷贝


示例:
#include <iostream>
#include <string>
using namespace std;
class Persion
{
public:
Persion(int age)
{
m_pAge = new int(age);
}
~Persion()
{
if (m_pAge)
{
delete m_pAge;
m_pAge = nullptr;
}
}
Persion& operator=(const Persion& p)
{
// 编译器提供的是浅拷贝
//m_pAge = p.m_pAge;
// 我们要写深拷贝
// 先判断是否有属性在堆区,如果有先释放干净,然后再深拷贝
if (m_pAge)
{
delete m_pAge;
m_pAge = nullptr;
}
// 深拷贝
m_pAge = new int(*p.m_pAge);
// 返回对象本身
return *this;
}
int *m_pAge;
};
void test01()
{
Persion p1(18);
cout << "p1的年龄为:" << *p1.m_pAge << endl; // 18
Persion p2(20);
cout << "p2的年龄为:" << *p2.m_pAge << endl; // 20
Persion p3(25);
cout << "p3的年龄为:" << *p3.m_pAge << endl; // 25
p1 = p2 = p3;
cout << "p1的年龄为:" << *p1.m_pAge << endl; // 25
cout << "p2的年龄为:" << *p2.m_pAge << endl; // 25
cout << "p3的年龄为:" << *p3.m_pAge << endl; // 25
}
int main()
{
test01();
system("pause");
return 0;
}
本文介绍了C++中赋值运算符重载的重要性,通过示例展示了浅拷贝导致的问题及如何通过实现深拷贝来解决。详细解释了在类中拥有动态分配内存的属性时,如何正确地重载赋值运算符以避免内存泄漏和数据错误。
1481

被折叠的 条评论
为什么被折叠?



