运算符重载
将一个没有赋值含义的字符进行重新修改 例如:==
简单的来说,运算符重载就是将对应的符号赋予新的意思,能够更加容易处理比较复杂的形式,例如对两个日期的比较,不只是单纯的数字之间的比较,我们就需要写一系列的代码,来将等于号重新赋予新的意思即可.
操作:返回值类型 operator操作符(参数列表)
1.用于内置类型的操作符,其含义不能发生改变
2.作为类成员函数,我们要比实际要写的参数少一个,因为在成员函数中,每一个函数内部都隐含有一个this指针,所以我们在创建时,需要少写一个,并且this指针的所在,是成员函数的第一个变量.
3…* 、:: 、sizeof 、?: 、. 注意以上5个运算符不能重载。这个经常在笔试选择题中出现。
class Date{
public:
Date(int y = 1, int m = 1, int d = 1){
_y = y;
_m = m;
_d = d;
}
bool isEqual(const Date& d){
return _y == d._y
&&_m == d._m
&&_d == d._d;
}
Date(const Date& d){
_y == d._y;
_m == d._m;
_d == d._d;
cout << "Date(const Date&)" << endl;
}
//成员函数都有隐藏的this指针
//作为成员函数,必须比实际的少一个
//这里出现的this 指针时钟指向从左往右的的第一个指针
bool operator==(const Date& d){
return _y == d._y
&&_m == d._m
&&_d == d._d;
}
//如果需要进行连续赋值,则返回值类型不能为空
//返回值类型为当前类型
Date& operator=(const Date& d){
//优化,判断对象是否是同一个对象: 通过指针进行判断
if (this != &d){
_y == d._y;
_m == d._m;
_d == d._d;
cout << "operator=" << endl;
}
return *this; //返回当前被处理好的对象的对应指针,再处理下一位变量
//return d;
}
~Date(){ //析构函数
cout << "~Date()" << endl;
}
private:
int _y;
int _m;
int _d;
};
上面的是一个类:
很清晰的我们可以看出内部有6个成员函数和三个成员变量,代码有点长,但是是很容易理解的,加油!!
下面的是运算符重载的具体操作:
void test1(){
Date d1(2021,12,25);
Date d2(2021,12,25);
//判断日期是否相等
if (d1 == d2){ //当你在这里进行了运算符重载的时候这里就不报错了
//因为这里的==运算符判断不清楚内部的是年还是月还是日的
//判断,所以我们要将这个==运算符进行重载,对其内部进行重
//新定义,让==符合日期进行比较的方式,才能进行日期的比较!
}
//====调用运算符重载的完整形式
//if (d1.operator==(d2))
//如果运算符重载函数不是成员内部的函数
//if (operator==(d1,d2))
//一般用这里的简写形式,比较方便,看起来简洁明了
if(d1==d2)
{
cout << "==" << endl;
}
else{
cout << "!=" << endl;
}
//if (d1.isEqual(d2)){ //直接在类的内部定义一个成员函数,直接是进行日期类代码的比较
//}
}
赋值运算符重载
将一个有赋值含义的字符进行修改 例如: =
1.参数类型
2.返回值
3.检测是否给自己进行赋值
4.返回*this
6.一个类如果没有显式定义赋值运算符重载,编译器也会生成一个,完成对象按字节序的值拷贝。
void test(){
Date d1(2021, 12, 25);
Date d2(2091, 12, 25);
Date d3(2031, 12, 25);
//赋值操作
简写
//d1 = d2;
全写
//d2.operator=(d3); //如果没有显示定义,编译器会自动修改生成
//d2 = d2; //如果是自己对自己进行定义,我们可以通过函数成员的优化来规避这一种情况
int a, b, c;
//连续赋值:从右向左
a = b = c = 100;
//完整形式
d1.operator=(d2.operator=(d3));
//简写形式
d1 = d2 = d3; //====这里接收到的参数类型不同
//不是赋值,为拷贝构造
Date d4 = d1; //用已经存在的变量对新的变量进行初始化,完成拷贝构造
}
对于赋值运算符就讲解到这里,主要就是理解运算符和赋值运算符的区别,主要不难,详细理解就可以了.多敲代码!!!加油!!!