一、运算符重载的概念
1. 什么是运算符重载:
1)重载,重新载入,就比如函数重载,对一个已有的函数赋值一个新的定义。因此同一个名字就可以有不同的含义
2)运算符也是可以重载的,不如cout在输出一个变量的时候,就接受不同类型的数据并输出,它就是重载了'<<'运算符,这个就是运算符重载
3)所以运算符指的是对已有的运算符重新定义新的运算规则,已适应不同的数据类型,当然重载之后,之前的运算规则还是有的
2. 为什么要进行运算符重载
运算符重载之后可以让运算符去适应不同的数据类型,对于基本数据类型,系统给出了运算符的操作规则,对于自定义数据类型来说,系统是不知道给出什么规则的
示例
class student
{
int id;
int age;
char name[20];
public:
student(int id, int age, const char *name)
{
this->id = id;
this->age = age;
strcpy(this->name, name);
}
}
student stu1 (1,23,"李四");
student stu2 (4,56,"王五");
//stu1 + stu2; //错误:编译器不知道这样相加加的是什么
二、运算符重载
1. 运算符重载类中的定义
1)关键字:operator(通过关键字来定义运算符重载)
2)定义:
函数返回值类型 operator 要重载的运算符(参数列表)
{
函数体;
}
示例
int operator+(const student & stu)
{
return this->age+stu.age;
}
//注意:因为我们这个运算符是在类中写的,
//所以是通过对象调用的,那么this指针会占一个参数,
//而且是第一个参数,也就是说如果我们重载一个运算符,
//是在类中,而这个运算符是个单目运算符,那么参数列表就不用写东西了,
//是双目,那么就需要传另一个参数进来
2. 运算符重载的特点
1)几乎所有的运算符都可以被重载
2)运算符重载基本出现在类中和结构体中
3) 运算符可以理解为函数的一个表现
3. 运算符重载的注意事项
1)重载运算符,这个重载的运算符还是满足原来的规则,不能说重载+,结果做的是-的事,这样会使在运算符重载的运用上增加很大的难度
2)运算符重载的参数,类中重载调用对象会占一个参数,就是this会占一个参,参数列表就是用来表示运算符的操作数的
3)对于运算符重载的调用,可以直接使用运算符,也可以通过对象,出来调用
4)考虑返回值,不同的运算符有不同的返回值,要记得满足运算符原来的规划
三、使用友元函数,实现运算符重载
类在已经实现且部分修改的情况下,需要进行运算符重载,就可以通过友元的方式来进行重载
示例
int operator+(const student& stu1,const student& stu2)
{
return stu1.id+stu2.id;
}
//因为这个是直接访问的私有成员,所以需要在类中声明一句
friend int operator+(const student& stu1,const student& stu2);
//使用可以,直接stu1+stu2; ==>operator+(stu1,stu2);
四、两个不能在类中重载的运算符
示例
class node
{
int val;
public:
node(){val = 10;}
friend istream& operator>>(istream& is, node& n);//输入
friend istream& operator<<(ostream& os, node& n);//输出
//前后++
node& operator++() //前++
{
this->val++;
return *this;
}
node operator++(int) //后++
{
node temp =* this; //保存val的值
this->val++; //val++
return *this; //返回的是没有++的val的值
}
//这里int是占位参,不用传参,只是用来区分前后++的
//---伪代码---//
void operator()()
{
cout<<"我是一个函数!!"<<endl;
}
};
friend istream& operator>>(istream& is, node& n)
{
is>>n.val;
return is;
}
friend istream& operator>>(ostream& os, node& n)
{
os<<n.val;
return os;
}
node n;
cin>>n; //对对象里面的val赋值
cout<<n; //输出对象里面的val值
n(); //输出:我是一个函数!!