day08
2023年3月12日
知识点1.运算符重载
运算符重载就是对已有的运算符重新定义,赋予其另一种功能,以适应不同的数据类型;
语法:函数名由关键字operator和运算符组成;
注意:重载运算符不要更改运算的本质操作,比如+是数据相加,不要重载为相减;
1、重载<<运算符
#include <iostream>
#include <cstring>
using namespace std;
class Student{
//作为类的友元函数
friend ostream& operator<<(ostream &out, Student &stu);
private:
char* name;//姓名
int num;//学号
public:
Student(const char* name, int num)
{
this->name = new char[strlen(name) + 1];
strcpy(this->name, name);
this->num = num;
}
void showStudent()
{
cout << "姓名:" << this->name << endl;
cout << "学号:" << this->num << endl;
}
~Student()
{
if (this->name != NULL)
{
delete [] this->name;
this->name = NULL;
}
}
};
//重载<<运算符,直接输出对象信息
ostream& operator<<(ostream& out, Student& stu)
{
out << "姓名:" << stu.name << endl;
out << "学号:" << stu.num << endl;
return out;
}
int main()
{
Student stu1("lucy", 1234);
stu1.showStudent();
cout << "-------------" << endl;
//重载<<运算符调用方式1
operator<< (cout, stu1);
cout << "-------------" << endl;
//重载<<运算符调用方式2
//去掉operator,第一个参数放在<<运算符左边,第二个参数放在<<运算符右边
cout << stu1;
cout << "-------------" << endl;
//重载<<运算符迭代调用
Student stu2("bob", 1235);
cout << stu1 << stu2;
return 0;
}
结果:
![](https://img-blog.csdnimg.cn/img_convert/ba1b0e0ca0d597566c60d2f2fdca125c.png)
2、成员函数重载加法运算符
#include <iostream>
using namespace std;
class Data{
private:
int num1;
int num2;
public:
Data(){}
Data(int num1, int num2)
{
this->num1 = num1;
this->num2 = num2;
}
//成员函数实现加法运算符重载
Data operator+(Data& ob)
{
int tem_num1 = this->num1 + ob.num1;
int tem_num2 = this->num2 + ob.num2;
Data tem(tem_num1, tem_num2);
return tem;
}
//显示类中信息
void showData()
{
cout << "num1 = " << this->num1 << endl;
cout << "num2 = " << this->num2 << endl;
}
~Data(){}
};
int main()
{
Data ob1(10, 20);
cout << "实例化对象ob1中信息:" << endl;
ob1.showData();
Data ob2(30, 40);
cout << "实例化对象ob2中信息:" << endl;
ob2.showData();
//成员函数实现加法运算符重载调用方式1
cout << "实例化对象ob1 + ob2中信息:" << endl;
ob1.operator+(ob2).showData();
//成员函数实现加法运算符重载调用方式2
cout << "实例化对象ob1 + ob2中信息:" << endl;
(ob1 + ob2).showData();
return 0;
}
结果:
![](https://img-blog.csdnimg.cn/img_convert/830818bae5700e3d6218734f2e0ae08b.png)
3、可重载的运算符:
![](https://img-blog.csdnimg.cn/img_convert/28653e5dda151832d9221c56ac258c55.png)
不可重载的运算符:
![](https://img-blog.csdnimg.cn/img_convert/cc7b11240d43317baa2b57c3b4aa1a3e.png)
重载运算符时不能改变运算符的优先级,不能改变运算符的参数个数。
4、自增自减(++、--)运算符重载
前置++,调用operator++(a);后置++,调用operator++(a,int);(自减相同)
#include <iostream>
using namespace std;
class Data{
//类的友元
friend ostream& operator<<(ostream& out, Data& ob);
private:
int a;
int b;
public:
Data(){ a = 0, b = 0; }
Data(int a, int b) : a(a), b(b){}
//前置++重载,++ob,先加后使用
Data& operator++()
{
a ++, b ++;
return *this;
}
//后置++重载,ob++,先使用后加
//int为占位符,区分前置++和后置++
Data& operator++(int)
{
static Data old = *this;
a ++, b ++;
return old;
}
//前置--重载,--ob,先减后使用
Data& operator--()
{
a --, b --;
return *this;
}
//后置--重载,ob--,先使用后减
Data& operator--(int)
{
static Data old = *this;
a --, b --;
return old;
}
~Data(){}
};
//重载<<运算符
ostream& operator<<(ostream& out, Data& ob)
{
out << "a = " << ob.a << ",b = " << ob.b;
return out;
}
int main()
{
Data ob1(10, 20);
cout << "使用重载<<运算符:" << endl;
cout << ob1 << endl;
cout << "------------------" << endl;
cout << "使用重载的前置++" << endl;
cout << ++ ob1 << endl;
cout << "------------------" << endl;
cout << "使用重载的后置++" << endl;
cout << ob1 ++ << endl;
cout << ob1 << endl;
cout << "------------------" << endl;
cout << "使用重载的前置--" << endl;
cout << -- ob1 << endl;
cout << "------------------" << endl;
cout << "使用重载的后置--" << endl;
cout << ob1 -- << endl;
cout << ob1 << endl;
cout << "------------------" << endl;
return 0;
}
结果:
![](https://img-blog.csdnimg.cn/img_convert/f7e1cd4ab7be1af776042e7ab8ff9558.png)