游戏开发之运算符重载(C++基础)

① 运算符重载就是对已有的操作规则重写定义,赋予其另一种功能,以适应不同的数据类型。
②运算符重载(operator overloading)只是一种“语义上的方便”,也就是它只是另一种函数调用的方式,其本质还是对函数的的调用。

1.重载函数运算符

重载的函数运算符关联友元函数。(友元函数是一个全局函数,只是友元函数可以访问某个类的私有成员变量。)
重载函数运算符的语法:数据类型 operator 运算符(参数列表){函数体}

 class A{//运算符重载关联友元函数friend std::istream& operator>>(std::istream& input, A &a);friend std::ostream& operator<<(std::ostream& output, const A &a);friend A operator+(const A& a1, const A& a2);//由于B类是在A类定义后才定义的,所以需要添加class关键字,告诉编译器在编译的时候是可以找到它的定义的,这样才不会报错。friend A operator+(const A& a, const class B& b);private:int a;};class B{//运算符重载关联友元函数friend std::istream& operator>>(std::istream& input, B &b);friend A operator+(const A& a, const B& b);private:int b;};//重载输入流// istream 输入流,字节流从输入设备流向内存。std::istream& operator>>(std::istream& input, A &a){input >> a.a;return input;}//重载输出流//ostream 输出流,字节流从内存流向输出设备。std::ostream& operator<<(std::ostream& output,const A &a){output << "A::a " << a.a << std::endl;return output;}//重载+运算符A operator+(const A& a1, const A& a2){A a;a.a = a1.a + a2.a;return a;}// istream 输入流,字节流从输入设备流向内存。std::istream& operator>>(std::istream& input, B &b){input >> b.b;return input;}//重载+运算符A operator+(const A& a, const B& b){A a1;a1.a = a.a + b.b;return a1;}int main(){//调用方式A a1, a2;B b1;std::cin >> a1 >> a2 >> b1;std::cout << a1 << a1 + a2 << a1 + b1;return 0;}

2.重载类中的运算符

在类中声明及定义的语法:数据类型 operator 运算符(参数列表){函数体}
类内的重载运算符受权限约束。
函数运算符重载有2个(friend 声明及类外定义)且还需要考虑类对象。
而类内的重载运算符不需要考虑类本身。

 class A{private:int a = 0;public://运算符重载受权限约束//重载+=运算符A& operator +=(const A &a){std::cout << "A" << std::endl;this->a += a.a;return *this;}//重载+=运算符A& operator+=(const int a){std::cout << "int" << std::endl;this->a += a;return *this;}//重载前置++和后置++A& operator++(){this->a += 1;return *this;}A operator++(int){A a1;a1.a = this->a;this->a++;return a1;}//重载*运算符int operator*() const{//返回实体return this->a;}//重载->运算符A* operator->(){return this;}void Print() const{std::cout << "Print" << std::endl;}//重载=运算符A& operator=(A& a){this->a = a->a;return *this;}};int main(){//访问方式(调用方式)A a;a += a += 1;//+=从右往左执行++a;a++;std::cout << *a << std::endl;a->Print();std::cout << *a << std::endl;A a1, a2;a1 = a2 = a;std::cout << *a1 << " " << *a2 << std::endl;return 0;}

3.类内函数调用符号()的重载

声明语法:类名& operator()(参数列表){赋值操作;return *this;}
如:类名& operator()(int x,int y){ 赋值操作; return *this;}
类外访问方式:
类名 变量名;
类名 a = 变量名(10,20);

4.不要重载&&、||运算符

会影响正常的表达式判断,不便于其它人员阅读,歧义很大。

5.可以重载的运算符及不可重载的运算符

在C++中几乎所有的运算符都可以重载,但是重载之前我们需要考虑是否会发生灾难性的编程事故,如:有人错误理解重载,总会有阅读别人代码的时候。

6.运算符重载总结

①=,[],和->操作运算符只能通过类内成员函数进行重载。
②<<和>>只能通过全局函数关联友元函数进行重载。
③不要重载&&和||操作符,因为无法实现短路规则。

游戏开发之运算符重载(C++基础)相关推荐

  1. 《OpenGL ES 2.0游戏开发(上卷):基础技术和典型案例》一6.6 本章小结

    本节书摘来异步社区<OpenGL ES 2.0游戏开发(上卷):基础技术和典型案例>一书中的第6章,第6.6节,作者: 吴亚峰 责编: 张涛,更多章节内容可以访问云栖社区"异步社 ...

  2. 《OpenGL ES 2.0游戏开发(上卷):基础技术和典型案例》——6.5节光照的每顶点计算与每片元计算...

    本节书摘来自异步社区<OpenGL ES 2.0游戏开发(上卷):基础技术和典型案例>一书中的第6章,第6.5节光照的每顶点计算与每片元计算,作者 吴亚峰,更多章节内容可以访问云栖社区&q ...

  3. 《OpenGL ES 2.0游戏开发(上卷):基础技术和典型案例》一第6章 让场景更逼真——光照效果...

    本节书摘来异步社区<OpenGL ES 2.0游戏开发(上卷):基础技术和典型案例>一书中的第6章,第6.1节,作者: 吴亚峰 责编: 张涛,更多章节内容可以访问云栖社区"异步社 ...

  4. 【游戏开发】Lua Love2d | Love2d基础知识

    小提示: 此系列文章属于个人学习笔记,如果其中有误,希望大家指正. 也希望大家能够提出一些游戏开发学习上的建议等等的~ 谢谢大家!(๑•̀ㅂ•́)و✧ 教程简介: 了解如何使用 LOVE 2D 和 L ...

  5. 【J2ME 2D 游戏开发系列】◣HIMI游戏开发启蒙教程◢JAVA零基础学习J2ME游戏开发全过程!...

    本站文章均为 李华明Himi 原创,转载务必在明显处注明:  转载自[黑米GameDev街区] 原文链接: http://www.himigame.com/j2me-2/774.html Himi从写 ...

  6. Silverlight3游戏开发之空当接龙基础篇

    说明:我是我2011年发表在IT168上面的一篇空当接龙文章的第一部分,后面几部分不好查找了.当然,我主要侧重学习微软ASP.NET及Silverlight+Windows Phone 7开发等技术. ...

  7. 【Unity】Unity 2D游戏开发(一)U2D基础功能

    文章目录 Unity 2D游戏开发基础知识 Animation动画 SortingLayer层排序 Physics 2D物理2D Rigidbody 2D刚体 示例 1.点击鼠标发出子弹 2.子弹打中 ...

  8. 【手把手带你Godot游戏开发 第一弹】零基础入门案例:FlappyBird(教程目录及源代码)

  9. 运算符重载 返回类型说明符后加_Python3基础:从独特的角度看运算符重载

    本文并不是用来向你介绍运算符重载的基础知识,如果你想了解运算符重载的基础知识,本文可能并不适合你.本文的目的是从独特的角度介绍运算符重载,让你更深入地,更本质地了解什么是运算符重载. 0.什么是运算符 ...

  10. 【269期门诊集锦】iOS游戏开发—2D游戏编程之我见

    技术门诊是51CTO社区品牌栏目,每周邀请一位客座专家,为广大技术网友解答疑问.从热门技术到前沿知识,从技术答疑到职业规划.每期一个主题,站在最新最热的技术前沿为你引航! 本期门诊特邀iOS游戏开发专 ...

最新文章

  1. /usr/bin/ld: cannot find -lltdl collect2: ld returned 1 exit status make: *** [sapi/cgi/php-cgi] Err
  2. vue_组件_监听组件事件
  3. SQL语言基础:SQL授权相关知识笔记​
  4. mysql migration tool 64bit_Migration Tool支持MySQL业务SQL迁移
  5. SoapUI接口测试之实战运用操作(五)
  6. php+jquery+ajax+json的一个最简单实例
  7. Scala的空值删除和空值填充
  8. 福晟集团积极探索让“住有所居”成为新时代转型之路
  9. 《演员的自我修养》读后感
  10. 输入上/下标数字以及字母
  11. Python实现自由爆率抽奖小程序
  12. 电脑变无线打印服务器,废品再利用 老电脑变网络打印服务器
  13. 一个简单有效的手写识别引擎
  14. ffmpeg之视频的编码手动添加SPS以及PPS
  15. 牛腩新闻发布--过程或函数 'news_selectByCaId' 需要参数 '@caid',但未提供该参数(一)
  16. 记录_20190814
  17. Windows平台RTMP、RTSP播放器录像模块精细化控制
  18. 旭日x3----ROS2-foxy版本 安装navigation2
  19. Android Studio Gradle UserGuide
  20. Elasticsearch分页解决方案研究

热门文章

  1. 恕我直言,你们的模型训练都还不够快
  2. Python常用画图代码(折线图、柱状图、饼图)
  3. 学生物的女朋友都能看懂的哈希表总结!
  4. 瞥一瞥AI,撩一撩算法
  5. 博文视点程序员读书节,大咖带你共读十日精彩
  6. 2天玩转单反相机(第二讲)
  7. Windows操作系统的缘由
  8. 如何高效地学习机器学习算法?
  9. Scikit-learn:分类模型评估Model evaluation
  10. 主题模型TopicModel:LDA编程实现