#include <iostream>
#include <string.h>
using namespace std;
/************************************************************************
赋值运算符重载
1.数据成员需要再堆区申请空间,则对象赋值时,存在深拷贝
/************************************************************************/
class Person{
//全局函数声明为该类的友元,可以访问该类的私有成员
friend ostream & operator<<(ostream &cout, Person &per);
public:
//有参构造
Person(int age, char* name)
{
m_age = age;
m_name = new char[strlen(name)+1];
strcpy(m_name, name);
}
//重载赋值运算符,否则系统提供默认拷贝构造函数(浅拷贝)会导致堆区内存多次释放
//为了能支持链式赋值per3=per2=per1,需要返回类的对象或引用
Person & operator=(const Person &per)
{
m_age = per.m_age;
//先释放原堆区空间,再重新申请
if (m_name != NULL)
{
delete m_name;
}
m_name = new char[strlen(per.m_name)+1];
strcpy(m_name, per.m_name);
return *this;//返回类的对象
}
~Person()
{
if (m_name != NULL)
{
delete m_name;
m_name = NULL;
}
}
private:
int m_age;
char *m_name;
};
//使用全局函数重载<<运算符
ostream & operator<<(ostream &cout, Person &per)
{
cout<<per.m_age<<","<<per.m_name;
return cout;
}
void test1()
{
Person per1(20, "Tom");
Person per2(30, "Jerry");
cout<<per1<<endl;
cout<<per2<<endl;
Person per3(40,"zhangsan");
//链式赋值
per3 = per2 = per1;
//per2和per3一样
cout<<per2<<endl;
cout<<per3<<endl;
}
int main()
{
test1();
return 0;
}
C++重载赋值运算符
最新推荐文章于 2024-08-14 17:41:01 发布