笔记:运算符的重载

时间:2022-01-10 17:22:31

C++中添加了对象这一概念,为了满足对象相加的情况,引入运算符重载这一语法。
代码中倘若是除类的基本类型相加的没有影响,我们理解为机内已经写好了相关的代码,但如果出现了对象互相相加,对象与基本类型相加的情况,由于对象的多样性,机内无法对所以情况加以概括,所以有了operator;
倘若是类与基本类型相加的情况时:

#include <iostream>
#include <cstdio>
#include <string>

using namespace std;

class peo {
public:
int age;

peo(){
age=12;
}
};
//类型一一对应
//预算符重载的返回值为了进行连续运算
//类外定义
int operator+ (peo& st,int a) {
return (st.age+a);
}
int main() {
peo st1;
cout << (st1+12) <<endl;

return 0;
}

从以上代码中可以看出operator基本语法类型,可以将它视为一种特殊的函数加以理解;
1.其中加号的两对对应的运算符重载的形参要一一对应;
2.返回值可以有多种,和普通函数相差无几;
3.代码中出现的只要非基本类型与基本类型相加的情况,都要用函数写出,否则错误
4.运算方式与以往算数运算方式一样

类内定义:

#include <iostream>
#include <cstdio>
#include <string>

using namespace std;

class peo {
public:
int age;

peo(){
age=12;
}
//类内定义
int operator+ (int a){//局限性:默认左侧是类
return (this->age+a);
}
};
//类型一一对应
//预算符重载的返回值为了进行连续运算
//int operator+ (peo& st,int a) {
// return (st.age+a);
//}
int main() {
peo st1;
cout << (st1+12) <<endl;

return 0;
}

为何在类中定义只需要一个参数?
有一种理解方式是:在类中的成员函数有一个默认参数(类似于this指针)
总结:类内定义运算符重载有局限性,运算符左侧默认是类!!!
必须是C++的有效字运算符才可以重载的,(否则不可以重载)其中作用与运算符(::),(.*)和(.),(?:)四种虽然是有效字符,但是也不能重载;
必须包含一个类的参数,因为基本类型的运算机内已经编写(仔细想想即可)
怎么判断使用类内定义还是类外定义,以下有几种判断方式:
1.改变对象状态的运算符,递增,自加等等,通常是类内定义(单目)
2.算数预算符,关系预算符,位运算通常是在类外定义
3.复合运算符 +=,-=等通常是类内定义
4.=,(),[],->,必须是类内定义