博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
第30课 - 操作符重载的概念
阅读量:4919 次
发布时间:2019-06-11

本文共 3516 字,大约阅读时间需要 11 分钟。

第30课 - 操作符重载的概念

1. 需要解决的问题

  下面的复数解决方案是否可行?    不可行+ 操作符只提供对C++ 基本数据类型的运算,不支持类的相加运算。

  

1 #include 
2 3 class Complex 4 { 5 int a; 6 int b; 7 public: 8 Complex(int a = 0, int b = 0) 9 {10 this->a = a;11 this->b = b;12 }13 14 int getA()15 {16 return a;17 }18 19 int getB()20 {21 return b;22 }23 24 friend Complex Add(const Complex& p1, const Complex& p2); // 友元函数25 };26 27 Complex Add(const Complex& p1, const Complex& p2)28 {29 Complex ret;30 31 ret.a = p1.a + p2.a;32 ret.b = p1.b + p2.b;33 34 return ret;35 }36 37 int main()38 {39 Complex c1(1, 2);40 Complex c2(3, 4);41 Complex c3 = Add(c1, c2); // c1 + c242 43 printf("c3.a = %d, c3.b = %d\n", c3.getA(), c3.getB());44 45 return 0;46 }
复数的加法操作

思考:Add 函数可以解决Complex 对象相加的问题,但是 Comples 是现实世界中确实存在的复数,并且复数在数学中的地位和普通的实数相同。  

为什么不让  +  操作符也支持复数相加呢?

2. 操作符的重载

2.1 操作符重载的概念

  (1)C++ 中的重载能够扩展操作符的功能

  (2)操作符的重载以函数的方式进行

  (3)本质:用特殊形式的函数扩展操作符的功能

2.2 operator关键字

  (1)通过 operator 关键字可以定义特殊的函数

  (2)operator 的本质是通过函数重载操作符

  (3)语法:

Type operator sign(const Type& p1, const Type& p2){    Type ret;        return ret;               }
1 #include 
2 3 class Complex 4 { 5 private: 6 int a; 7 int b; 8 public: 9 Complex(int a = 0, int b = 0)10 {11 this->a = a;12 this->b = b;13 }14 15 int getA()16 {17 return a;18 }19 20 int getB()21 {22 return b;23 }24 25 friend Complex operator +(Complex& p1, Complex& p2);26 };27 28 Complex operator +(Complex& p1, Complex& p2)29 {30 Complex ret;31 32 ret.a = p1.a + p2.a;33 ret.b = p1.b + p2.b;34 35 return ret;36 }37 38 int main(void)39 {40 Complex c1(1, 2);41 Complex c2(3, 4);42 43 Complex c3 = c1 + c2; // operator +(c1, c2)44 45 printf("c3.a = %d, c3.b = %d\n", c3.getA(), c3.getB());46 47 return 0;48 }
操作符重载初探

2.3 将操作符重载函数定义为类的成员函数

  (1)比全局操作符重载函数少一个参数(左操作数,类的内部,由this指针完成)

  (2)不需要依赖友元就可以完成操作符重载

  (3)编译器优先在成员函数中寻找操作符重载函数

class Type{public:    Type operator Sign(const Type& p)    {         Type ret;          return ret;    }};
1 #include 
2 3 class Complex 4 { 5 private: 6 int a; 7 int b; 8 public: 9 Complex(int a = 0, int b = 0)10 {11 this->a = a;12 this->b = b;13 }14 15 int getA()16 {17 return a;18 }19 20 int getB()21 {22 return b;23 }24 25 Complex operator + (const Complex& p)26 {27 Complex ret;28 printf("Complex operator + (const Complex& p)\n");29 ret.a = this->a + p.a;30 ret.b = this->b + p.b;31 32 return ret;33 }34 friend Complex operator + (const Complex& p1, const Complex& p2);35 };36 37 38 Complex operator + (const Complex& p1, const Complex& p2)39 {40 Complex ret;41 printf("Complex operator + (const Complex& p1, const Complex& p2)\n");42 ret.a = p1.a + p2.a;43 ret.b = p1.b + p2.b;44 45 return ret;46 }47 48 49 int main(void)50 {51 Complex c1(1, 2);52 Complex c2(3, 4);53 54 Complex c3 = c1 + c2;55 56 printf("c3.a = %d, c3.b = %d\n", c3.getA(), c3.getB());57 58 return 0;59 }
成员函数重载操作符

3. 小结

  (1)操作符重载是C++ 的强大特性之一

  (2)操作符重载的本质是通过函数扩展操作符的功能

  (3)operator 关键字是实现操作符重载的关键

  (4)操作符重载遵循相同的函数重载规则

  (5)全局函数成员函数都可以实现对操作符的重载

 

转载于:https://www.cnblogs.com/shiwenjie/p/7283908.html

你可能感兴趣的文章
Django-Form组件之字段
查看>>
微信小程序 键盘显示短信验证码
查看>>
Spring Boot 动态修改 Scheduled (系统启动默认执行,动态修改)
查看>>
Docker + Tomcat 实现 Springboot 项目增量升级
查看>>
SpringBoot 部署war包
查看>>
Redis 分布式锁 解决集群环境下多次定时任务执行
查看>>
echart-图表位置改变
查看>>
表单验证神器-validate
查看>>
图片上传的问题-偶现base64图片 小黑块问题
查看>>
echart-legend的图例改变
查看>>
表格-固定列 固定行
查看>>
bootstrap radio
查看>>
mobileSelect.js 运用 input 不让吊起小键盘
查看>>
cropper.js图片裁剪——第二弹
查看>>
axios 请求数据 入门级介绍
查看>>
PHP学习笔记
查看>>
kali安装vmtool后依旧无法拖拽文件,复制粘贴,解决办法
查看>>
【编程范式】函数式基础图示
查看>>
【JS语法】作用域与绑定图示
查看>>
未在本地计算机注册vfpoledb
查看>>