1.加号运算符重载
成员函数重载 operator+(Person &p)
全局函数重载 operator+ (Person& p1,Person&p2)
2.左移运算符重载
目的:cout<<p<<endl,为了直接输出一个对象
必须写全局函数,因为要受用输出流
语法:ostream& operator<<( ostream& cout , Person & p1 ){return cout;}
3.前置 后置++运算符重载
前置++:operator++()
后置++:operator++(int)
注意:后置++代码中进行了一次拷贝构造临时对象,开销比前置++大
4.赋值运算符重载
赋值运算符重载
系统默认给类中提供的,赋值运算符方法,是简单的值拷贝。
若类中有指针指向堆区的指针,就可能出现深浅拷贝问题,所以重载赋值运算符
5.[]运算符重载
int& operator[]( int index)
{
return this->p[index];
}
加号运算符重载案例
#include<iostream>
using namespace std;
class Person
{
public:
Person(){}
Person(int a,int b):m_A(a),m_B(b)
{}
/*Person& operator+(Person &p2)
{
Person tmp;
tmp.m_A=this->m_A+p2.m_A;
tmp.m_B=this->m_B+p2.m_B;
return tmp;
}*/
int m_A;
int m_B;
};
Person& operator+(Person &p1,Person &p2)
{
Person tmp;
tmp.m_A=p1.m_A+p2.m_A;
tmp.m_B=p1.m_B+p2.m_B;
return tmp;
}
void test01()
{
Person p1(1,2);
Person p2(1,2);
Person p3=p1+p2;
cout<<p3.m_A<<endl;
cout<<p3.m_B<<endl;
}
int main()
{
test01();
return 0;
}
左移运算符重载案例
#include<iostream>
using namespace std;
class Person
{
friend ostream& operator<<(ostream& cout, Person &p1);
public:
Person(){}
Person(int a,int b):m_A(a),m_B(b)
{}
private:
int m_A;
int m_B;
};
//左移运算符重载必须写在全局(给一个友元函数)
ostream& operator<<(ostream& cout, Person &p1)
{
cout<<p1.m_A<<" "<<p1.m_B;
return cout;
}
int main()
{
Person p1(1,2);
cout<<p1<<endl;
return 0;
}
赋值运算符重载案例
#define _CRT_SECURE_NO_WARNINGS
#include<iostream>
using namespace std;
class Person
{
public:
Person(char * name)
{
this->pName=new char[strlen(name)+1];
strcpy(this->pName,name);
}
Person& operator=(const Person &p)
{
//先清空pName指针
if(pName!=NULL)
{
delete [] pName;
pName=NULL;
}
//再进行赋值操作
this->pName=new char[strlen(p.pName)+1];
strcpy(this->pName,p.pName);
return *this;
}
~Person()
{
if(pName!=NULL)
{
delete [] pName;
pName=NULL;
}
}
char * pName;
};
void test01()
{
Person p1("狗蛋");
Person p2("狗剩");
p2=p1; //此处会崩掉,因为浅拷贝问题,故需要重载赋值运算符
cout<<p1.pName<<endl;
Person p3(" ");
p3=p2=p1;
cout<<p3.pName<<endl;
}
int main()
{
test01();
return 0;
}