简单介绍C++运算符重载与多继承及二义性

Crq
Crq
管理员
1904
文章
0
粉丝
Linux教程评论20字数 963阅读3分12秒阅读模式
摘要继友元知识过后,就到了今天的C++运算符重载的内容了,运算符重载是C++里比较重要的内容。这篇博文不会一下子讲完各种运算符重载,因为太多了了也不好吸收掌握,所以运算符重载我准备分多...
1.类外运算符重载
  1. class Point {
  2. private:
  3. int x,y;
  4. public:
  5. // 系统C++源码,大量使用此方式 :x(x), y(y)
  6. Point(int x, int y) :x(x), y(y) {}
  7. // set get 函数
  8. void setX(int x) {
  9. this->x = x;
  10. }
  11. void setY(int y) {
  12. this->y = y;
  13. }
  14. int getX() {
  15. return this->x;
  16. }
  17. int getY() {
  18. return this->y;
  19. }
  20. };
  21. /*类外运算符重载
  22. * 在真实开发过程中,基本上都是写在类的里面的,外部是不能获取内部的私有成员的
  23. * */
  24. Point operator + (Point point1,Point point2){
  25. int x = point1.getX() + point2.getX();
  26. int y = point1.getY() + point2.getY();
  27. Point res(x, y);
  28. return res;
  29. }
  30. int main(){
  31. Point pointA(10,20);
  32. Point pointB(10,20);
  33. Point pointC=pointA+pointB;
  34. cout
  35. 日志输出:
  36. 20 , 40
  37. 两个对象做+法运算就是执行了运算符重载函数

  38. 2.类内部运算符号重载
  39. class Point {
  40. private:
  41.     int x,y;
  42. public:
  43.     Point(){}
  44.     // 系统C++源码,大量使用此方式 :x(x), y(y)
  45.     Point(int x, int y) :x(x), y(y) {}
  46.     // set get 函数
  47.     void setX(int x) {
  48.         this->x = x;
  49.     }
  50.     void setY(int y) {
  51.         this->y = y;
  52.     }
  53.     int getX() {
  54.         return this->x;
  55.     }
  56.     int getY() {
  57.         return this->y;
  58.     }
  59.     /*
  60.      * 常量引用:不允许修改,只读模式
  61.      * & 性能的提高,如果没有&  运行+ 构建新的副本,会浪费性能
  62.      * 如果增加了& 引用是给这块内存空间取一个别名而已
  63.      * */
  64.     Point operator + (const Point & point){
  65.         int x=this->x+point.x;
  66.         int y=this->y+point.y;
  67.         return Point(x,y);
  68.     }
  69.     Point operator - (const Point & point){
  70.         int x=this->x-point.x;
  71.         int y=this->y-point.y;
  72.         return Point(x,y);
  73.     }
  74.     void operator ++() { //  ++对象
  75.         this->x = this->x + 1;
  76.         this->y = this->y + 1;
  77.     }
  78.     void operator ++ (int) { // 对象++
  79.         this->x = this->x + 1;
  80.         this->y = this->y + 1;
  81.     }
  82.     /*重载> (istream & _START, Point & point) {
  83.         // 接收用户的输入,把输入的信息
  84.         _START >> point.x >> point.y;
  85.         return _START;
  86.     }
  87. };
  88. int main(){
  89.     Point pointA(30,50);
  90.     Point pointB(10,20);
  91. //    Point pointC=pointA-pointB;
  92.     ++pointA;
  93. //    cout > pointC; // >> 是我们自己重载的哦
  94.     cout 
  95.  
  96. 类内部运算符重载,允许访问私有变量
  97. 传入的参数是常量引用,const 表示不可更改,& 可以提升性能,只会有一个变量别名,不加会拷贝一份,浪费内存。
  98. > 重载,需要加friend 友元函数来进行重载
  99. ostream & _START:表示输出
  100. istream & _START:表示输入
  101. 3.[] 运算符号重载
  102. class ArrayClass {
  103. private:
  104.     int size =0 ; // 大小  开发过程中,给size赋默认值,不然可能会出现,无穷大的问题
  105.     int * arrayValue; // 数组存放 int 类型的很多值
  106. public:
  107.     ArrayClass(){
  108.         /*指针类型必须分配空间*/
  109.         arrayValue= static_cast(malloc(sizeof(int *) * 10));
  110.     }
  111.     void set(int index, int value) {
  112.         arrayValue[index] = value; // []目前不是我的
  113.         size+=1;
  114.     }
  115.     int getSize() { // size成员的目标:是为了循环可以遍历
  116.         return this->size;
  117.     }
  118.     // 运算符重载 [index]
  119.     int operator[](int index) {
  120.         return this->arrayValue[index]; // 系统的
  121.     }
  122. };
  123. // 输出容器的内容
  124. void printfArryClass(ArrayClass arrayClass) {
  125.     cout 
  126. 4.c++继承
  127. class Person {
  128. public:
  129.     char *name;
  130.     int age;
  131. public:
  132.     Person(char *name, int age) : name(name) {
  133.         this->age = age;
  134.         cout name age 
  135.  
  136. 默认是 隐式代码: : private Person
  137. 私有继承:在子类里面是可以访问父类的成员,但是在类的外面不行
  138. 必须公开继承,才可以访问父类的成员
  139. 先执行父类的构造函数,再执行子类的构造函数
  140. 5.多继承
  141. class BaseActivity1 {
  142. public:
  143.     void onCreate() {
  144.         cout 
  145.  
  146. c++ 允许多继承,可能会出现二义性,原则上是尽量避免二义性
  147. 通过明确父类的方式解决二义性
  148. 通过子类重写父类的方法规避二义性
  149. 6.通过虚继承来解决二义性问题
  150. // 祖父类
  151. class Object{
  152. public:
  153.     int number;
  154.     void show() {
  155.         cout 
  156.  
  157. 如果没有虚继承,那么son对象访问number就会报二义性的问题,同时访问show方法同样存在二义性问题
  158. 由于在继承的时候添加了虚继承,就能解决类似这样的问题,虚继承的含义是:将通过继承得来的numbershow方法,放置在另外一个统一空间上,这样子类再访问的时候就不会出现二义性的问题了。
  159. 到此这篇关于C++运算符重载与多继承及二义性详解的文章就介绍到这了

weinxin
我的微信
微信号已复制
我的微信
这是我的微信扫一扫
 
Crq
  • 本文由 Crq 发表于2025年3月16日 09:38:42
  • 转载请注明:https://www.cncrq.com/13468.html
JavaScript 现状:方言篇 Linux教程

JavaScript 现状:方言篇

JavaScript 和其他编程语言有一个很大的不同,它不像单纯的一个语言,而像一个由众多方言组成大家族。从 2009 年 CoffeeScript 出现开始,近几年出现了大量基于...
匿名

发表评论

匿名网友
:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:
确定

拖动滑块以完成验证
加载中...