当前位置: 首页 > news >正文

C++(三)——运算符重载

运算符重载

重定义或重载大部分 C++ 内置的运算符就能使用自定义类型的运算符。重载的运算符是带有特殊名称的函数,函数名是由关键字 operator 和其后要重载的运算符符号构成的。与其他函数一样,重载运算符有一个返回类型和一个参数列表。不能为了重载而重载     重载之后的运算符和原来的使用方式特性一模一样

可重载的运算符列表

双目算术运算符	+ (加),-(减),*(乘),/(除),% (取模)关系运算符	==(等于),!= (不等于),< (小于),> (大于),<=(小于等于),>=(大于等于)逻辑运算符	||(逻辑或),&&(逻辑与),!(逻辑非)单目运算符	+ (正),-(负),*(指针),&(取地址)自增自减运算符	++(自增),--(自减)位运算符	| (按位或),& (按位与),~(按位取反),^(按位异或),,<< (左移),>>(右移)赋值运算符	=, +=, -=, *=, /= , % = , &=, |=, ^=, <<=, >>=空间申请与释放	new, delete, new[ ] , delete[]其他运算符	()(函数调用),->(成员访问),,(逗号),[](下标)

不可重载的运算符列表

.              :成员访问运算符
->           :成员指针访问运算符
::            :域运算符
sizeof    :长度运算符
?:          :条件运算符
#           : 预处理符号

+ - 两个运算符的重载

#include <iostream>using namespace std;class dog 
{private:int weight ;string name;public://构造函数dog(string name , int weight){this->name = name ;this->weight = weight ;}//拷贝构造dog(const dog & obj){this->name = obj.name;this->weight = obj.weight;}//移动dog(const dog && obj){this->name = obj.name;this->weight = obj.weight;}//析够函数~dog(){}//+两只狗体重之和dog & operator +(const dog & obj ){static dog temp(" ",1);temp.weight = this->weight + obj.weight;temp.name = this->name + "和" + obj.name;return temp;}//-两只狗体重之差dog & operator -(const dog & obj ){static dog temp(" ",1);temp.weight = this->weight - obj.weight;temp.name = this->name + "和" + obj.name+"体重相差";return temp;}friend ostream & operator <<(ostream & os , dog & obj );};//输出<<重载
ostream & operator <<(ostream & os , dog & obj )
{os<<"名字:"<<obj.name<<endl<<"体重:"<<obj.weight<<endl;return os;
}int main()
{dog g1("土狗🐶",25);dog g2("小狗🐶",26);cout<<g1<<g2;cout<<g1+g2;cout<<g2-g1;return 0;
}

运行结果:
在这里插入图片描述


其他运算符实例代码

#include <iostream>
#include <cstring>using namespace std;class Arr
{private:char * arr;int len ;int size;public://构造Arr(char * str){len = strlen(str);size = len+1;arr = new char[size];strcpy(arr,str);}//拷贝构造🐶Arr(Arr & obj){arr = new char[obj.size];len = obj.len;size = obj.size;strcpy(arr,obj.arr);}//🐣移动构造🐶Arr(Arr && obj ){len = obj.len;size = obj.size;arr = obj.arr;obj.arr = nullptr;}//+=重载:两个字符串连接Arr & operator +=(const Arr &obj){if(obj.len + this->len > this->size ){char * p = new char[obj.len+len+1];strcpy(p,arr);delete []arr;arr = p ;p = nullptr;size = obj.len+len+1;}strcat(arr,obj.arr);len = len + obj.len ;return *this;}//= 实现字符串复制功能🐮Arr & operator =(const Arr &obj){if(obj.len > size ){char *p = new char[obj.size];strcpy(p,obj.arr);arr = p ;p = nullptr;size = obj.size;}else{strcpy(this->arr,obj.arr);}len = obj.len;return *this;}//[] 🏇char & operator [](const int i ){   return arr[i];}//()🦆void operator ()(){cout<<"hello new ()"<<endl;}friend ostream & operator <<(ostream & os , const Arr & obj);friend istream & operator >>(istream & is , const Arr & obj );};ostream & operator <<(ostream & os , const Arr & obj)
{os<<"data:"<<obj.arr<<endl<<"len ="<<obj.len<<endl<<endl<<"size="<<obj.size<<endl;return os;}istream & operator >>(istream & is , const Arr & obj )
{is>>obj.arr;return is;
}
int main()
{char buf[] = {"n牛🐮"};char buf1[] = {"m马🏇"};Arr a = buf;Arr b = buf1;cout<<a<<endl;a +=b;cout<<a<<endl;a=b;cout<<a<<endl;a[0]= 't';cout<<a<<endl;a();cin>>a;cout<<a<<endl;}
http://www.lryc.cn/news/164384.html

相关文章:

  • 【Springcloud】elk分布式日志
  • 华为mate60麒麟9000s的架构体系
  • 面试半个月后的一些想法
  • 基于FPGA的图像二值化处理,包括tb测试文件和MATLAB辅助验证
  • 文件操作(个人学习笔记黑马学习)
  • Android Studio新版本New UI及相关设置丨遥遥领先版
  • 新型人工智能技术让机器人的识别能力大幅提升
  • 聚观早报|蚂蚁集团发布“蚁天鉴”;vivo X100系列即将亮相
  • 读高性能MySQL(第4版)笔记05_优化服务器设置
  • Spring Boot跨域问题简介
  • 【Java】过滤器和拦截器区别
  • es滚动查询分析和使用步骤
  • 飞书公式总结
  • vue3.2 导出pdf文件或表格数据
  • Linux学习--MySQL学习之查询语句
  • 三、视频设备的枚举以及插拔检测
  • Qt开发_调用OpenCV(4.x)完成人脸检测并绘制马赛克(摄像头实时数据)
  • ssl证书有效期为什么越来越短?
  • XFF漏洞利用([SWPUCTF 2021 新赛]Do_you_know_http)
  • Java——》JVM对原生的锁做了哪些优化
  • 华为云云耀云服务器L实例评测|用docker搭建frp服务测试
  • 群狼调研(长沙满意度调查专业公司)开展公交车乘客满意度调查
  • Spring与OAuth2:实现第三方认证和授权的最佳实践
  • Mysql的定时备份与恢复
  • 学习Java基础面试题第五天
  • (10)(10.9) 术语表(一)
  • 面试(类加载器)
  • 二维差分---基础算法
  • C++之结构体智能指针shared_ptr实例(一百九十四)
  • 初出茅庐的小李博客之根据编译时间生成软件版本号