C++赋值运算符重载
在C++中创建对象时编译器会自动添加帮我们写好赋值重载,用于对属性的值进行拷贝
例如:
#include <iostream>
#include <string>
using namespace std;
class person
{
private:
public:
int m_age;
string m_name;
person(/* args */);
person(string name,int age)
{
m_name=name;
m_age=age;
}
~person();
};
person::person(/* args */)
{
}
person::~person()
{
}
int main() {
person p1("张三",18);
person p2;
p2=p1;//这是赋值,不是拷贝构造
cout<<"姓名="<<p2.m_name<<','<< "年龄="<<p2.m_age<<endl;
system("pause");
}
p2的属性输出:
说明:以上是由编译器帮我们写好的赋值重载,可以看出只是对属性值的拷贝。如果我们类属性改为是指向栈区里的
例如:
person(string name,int age)
{
m_name=name;
m_age=new int(age);//将年龄放在栈区
}
那么就要考虑深浅拷贝的问题。
解决方法:
我们自己写赋值重载
例如:
#include <iostream>
#include <string>
using namespace std;
class person
{
private:
public:
int * m_age;
string m_name;
person(/* args */)
{
}
person(string name,int age)
{
m_name=name;
m_age=new int(age);
}
person& operator=(person &p)//重载赋值运算符
{
m_name=p.m_name;
m_age=new int(*p.m_age);
return *this;
}
~person()
{
if(m_age!=NULL)
{
delete(m_age);
m_age=NULL;
}
}
};
int main() {
person p1("张三",18);
person p2;
p2=p1;//这是赋值,不是拷贝构造
cout<<"姓名="<<p2.m_name<<','<< "年龄="<<*p2.m_age<<endl;
system("pause");
}
说明:这个案例如果用的是编译器提供的赋值重载,因为仅仅对属性值的拷贝导致有两个int * 指针指向同一块空间,那么在析构的时候就会造成一块内存被释放两次的错误。