C++运算符重载
运算符重载基本概念
运算符重载,就是对已有的运算符重新定义,赋予另一种功能,可以适用于不同的数据类型。但是运算符不能改变本来的寓意,不能改变基础类型寓意
在C++中,可以定义一个处理类的新运算符,这种定义像一个普通的函数定义,只是函数名字由operator及其紧跟的运算符组成。它像任何函数一样也是一个函数,当编译器遇到适当的情况时候,就会调用这个函数。
语法
定义重载运算符与定义函数相似 例如 operator¥,这里的¥代表重载的运算符例如, operator+,operator<<。
函数的参数取决于,1.运算符是一元运算符还是二元运算符.2.运算符被定义为全局函数时,一元运算符时一个参数,二元运算符时两个参数。定义为成员函数一元运算符没有参数,二元运算符是一个参数。
可重载的运算符
基本上C语言的运算符都可以重载,但运算符重载的使用时相当受限制。==不能使用没有意义的运算符,不能改变运算符优先级,不能改变运算符的参数个数。==不过不限制,会混淆寓意
除赋值运算符外,基类(父类)中被重载的操做符都将被派生类继承
特殊运算符
=,[],(),->操做只能通过成员函数进行重载。
<<,>>操做运算符最好通过友元函数进行重载。
不要重载&&,||操作符,因为无法实现短路规则
运算符使用的建议
运算符 | 建议使用 |
---|---|
所有一元运算符 | 成员 |
=,->,->*,(),[] | 必须时成员 |
+=,*=,-=,/=,%=,&=,!=,>>= | 成员 |
其他二元运算符 | 非成员 |
加号和减号运算符重载
加号运算符重载
同类型对象相加
写成全局函数
class Student
{
public:
Student(int id, int age)
{
this->Id = id;
this->Age = age;
}
public:
int Id;
int Age;
};
//全局方式,当编译器调用这个函数
//加号运算符重载写成全局函数需要两个参数,编译器会检查参数是否对应,第一个参数时加号左边,第二个参数时加号右边。
Student operator+(Student& s1, Student& s2)
{
Student temp(s1.Id + s2.Id, s1.Id + s2.Age)
return temp;
}
void test01()
{
Student s1(1,20);
Student s2(2,20);
Student s3 = s1 + s2;//编译器看到两个对象相加,会找operator+的函数
cout << "Id = " << s3.Id << "age = " << S3.Age << endl;
//多个对象相加
Student s4 = s1 + s2 + s3;
cout << "Id = " << s4.Id << "Age = " << s4.Age << endl;
}
写成类成员函数
class Student
{
public:
Student(int id, int age)
{
this->Id = id;
this->Age = age;
}
//写成类的成员函数,只需要写一个参数,这个参数是加号右边的数字
Student operator+(Student& s1)
{
Student temp(this->Id + s1.Id, this->Age + s1.Age)
return temp;
}
public:
int Id;
int Age;
};
不同类型对象相加
不同对象的相加与同对象相加非常相似,只需写好需要什么变量相加就可以
class Student
{
public:
Student(int id, int age)
{
this->Id = id;
this->Age = age;
}
public:
int Id;
int Age;
};
class Teacher
{
public:
Teacher(int id)
{
this->Id = id;
}
public:
int Id;
};
//传入两个参数,分别为Student类和Teacher类。
Student operator+(Student& s, Teacher& t)
{
Student temp(s.Id + t.Id, s.Age);
return temp;
}
//需要改变参数顺序
Student operator+(Teacher& t,Student& s)
{
Student temp(s.Id + t.Id, s.Age);
return temp;
}
void test02()
{
Student s1(1,20);
Teacher t1(10);
Student s2 = s1 + t1;//不同对象相加
Student s3 = t1 + s1