运算符重载使得用户自定义的数据以一种更简洁的方式工作。
让自定义数据类型有机会进行运算符操作 ----------运算符重载机制
运算符重载本质是一种函数,还是调用函数
运算符重载的规则
(1)不能发明新的运算符
(2)不能改变运算符的操作对象个数
(3)运算符重载后 其优先性和结合性不会变
(4)不能重载的运算符
作用域解析运算符 ::
条件运算符 ?:
直接成员访问运算符 .
类成员指针引用的运算符 .*
还有一个 sizeof
(5)除了流运算符是由友元函数重载,其他的运算法最好在类的成员函数中使用
运算符重载的格式
函数返回类型 operator 运算符 (参数表);
实现运算符重载的两种方法
(1)类的成员函数
(2)友元函数
注意: 成员函数有this指针,友元函数没有this指针
成员函数运算符重载
class Test
{
public:
Test(){}
Test(int a, int b)
{
this->a = a;
this->b = b;
}
void GET()
{
cout<<"=============="<<endl;
cout<<"a = "<<a<<endl;
cout<<"b = "<<b<<endl;
cout<<"=============="<<endl;
}
//实现二元运算符重载
//成员函数重载时,函数的参数列表只需要一个形参即可
//另一个参数是类的成员变量,用this指针表示
Test operator+(Test &obj)
{
Test tmp;
tmp.a= this->a + obj.a; //使用的使用两个元都在
tmp.b= this->b + obj.b;
return tmp;
}
//实现一元运算符重载 前置-- 就是a--;
//参数用this指针表示所以就看起来没有参数
Test & operator--()
{
Test tmp;
tmp.a = this->a--;
tmp.b = this->b--;
return tmp;
}
//当然还有后置的--
//int是占位符,只是C++编译器为了区分前置++ 和 后置++重载函数的标志
//因为函数重载是不care返回值的只care参数的顺序、个数、类型
Test operator--(int)
{
Test tmp;
tmp.a = this->--a;
tmp.b = this->--a;
return tmp;
}
//重载等号操作符 其实这个是比较常用的
//重载=运算符 =运算符应该有两个操作数的 this是一个 t是一个
//注意深拷贝和浅拷贝的问题
Test& operator=(Test & t)
{
this->a = t.a;
this->b = t.b;
if(this->ch_ != NULL) //先判断一下要被赋值的变量是不是空的,也就是清除空间
{
this->ch_ = NULL;
}
this->ch_ = new char[strlen(t.ch_)+1]; //注意空间要加1
strcpy(ch_,t.ch_);
return *this; //注意返回值
}
private:
int a;
int b;
char * ch;
};
int main()
{
}
用友元函数重载<< >>运算符
//注意 << >> 运算符是二元操作符 比如 cout << a cout和a是操作数
#include <iostream>
using namespace std;
class Test
{
public:
Test(int m,int n):a(m),b(n)
{
}
friend ostream& operator<<(ostream &out,Test&tmp);
private:
int a;
int b;
};
//友元函数
//函数有返回值可以实现链式编程
/*为什么要有返回值呢
void operator<<(ostream &out,Test &tmp)不可以吗
其实也是可以的,只不过不能实现链式编程了 cout << t1 <<"12345";
当函数没有返回值 执行完cout << t1 后返回的是 void 但是 void.operator<<("12345") 是错误的
应该是 ostream.operator<<("12345")才可以 ,所以应该返回 ostream*/
ostream & operator<<(ostream &out,Test &tmp)
{
out<<tmp.a<<endl;
out<<tmp.b<<endl;
return out;
}
int main()
{
Test t1(1,2);
cout<<"hello world"<<endl;
cout<<t1<<endl;
return 0;
}
来源:CSDN
作者:洛阳鱼紫怡
链接:https://blog.csdn.net/weixin_42148156/article/details/103792729