目录

  • 重载运算符

    • 四、重载运算符

      • 1.一元运算符重载
      • 2.二元运算符重载

重载运算符

四、重载运算符

概念 : 给原有运算符赋予新功能。

本质 : 函数重载。

关键字 : operator

1.一元运算符重载

符号只与一个操作数进行运算。

Ⅰ -(负号)的重载(取反啊)

  • 友元函数重载

    // Coordinate.hpp
    class Coordinate {  friend Coordinate& operator-(Coordinate &coor);public:Coordinate(int x, int y);private:int m_iX;int m_iY;
    };// Coordinate.cpp
    Coordinate& Coordinate::operator-(Coordinate &coor) {coor.m_iX = -coor.m_iX;coor.m_iY = -coor.m_iY;return *this;
    }// main.cpp
    int main() {Coordinate coor(3, 5);-coor;    // operator-(coor);return 0;
    }

  • 成员函数重载

    // Coordinate.hpp
    class Coordinate {public:Coordinate(int x, int y);Coordinate& operator-();    // 有this指针private:int m_iX;int m_iY;
    };// Coordinate.cpp
    Coordinate& Coordinate::operator-() {m_iX = -m_iX;m_iY = -m_iY;return *this;
    }// main.cpp
    int main() {Coordinate coor(3, 5);-coor;    // coor.operator-();return 0;
    }

Ⅱ ++符号的重载

  • 前置++符号重载

    // Coordinate.hpp
    class Coordinate {public:Coordinate(int x, int y);Coordinate& operator++();   // 前置++private:int m_iX;int m_iY;
    };// Coordinate.cpp
    Coordinate& Coordinate::operator++() {m_iX++;m_iY++;return *this;
    }// main.cpp
    int main() {Coordinate coor(3, 5);++coor;   // coor.operator++();return 0;
    }
  • 后置++符号重载

    // Coordinate.hpp
    class Coordinate {public:Coordinate(int x, int y);Coordinate operator++(int); // 后置++(int用来标识当前的++是后置重载,并不接受任何入参)private:int m_iX;int m_iY;
    };// Coordinate.cpp
    Coordinate Coordinate::operator++(int) {Coordinate oldCoor(*this);m_iX++;m_iY++;return oldCoor;
    }// main.cpp
    int main() {Coordinate coor(3, 5);coor++;   // coor.operator++(0);return 0;
    }

2.二元运算符重载

符号与两个个操作数进行运算。

Ⅰ +(加号)的重载

  • 友元函数重载

    // Coordinate.hpp
    class Coordinate {friend Coordinate operator+(const Coordinate &coor1, const Coordinate &coor2);public:Coordinate(int x, int y);private:int m_iX;int m_iY;
    };// Coordinate.cpp
    Coordinate operator+(const Coordinate &coor1, const Coordinate &coor2) {Coordinate tempCoor;tempCoor.m_iX = coor1.m_iX + coor2.m_iX;tempCoor.m_iY = coor1.m_iY + coor2.m_iY;return tempCoor;
    }// main.cpp
    int main() {Coordinate coor1(3, 5);Coordinate coor2(4, 6);Coordinate coor3(0, 0);coor3 = coor1 + coor2;    // coor3 = operator+(coor1, coor2);return 0;
    }

  • 成员函数重载

    // Coordinate.hpp
    class Coordinate {public:Coordinate(int x, int y);Coordinate operator+(const Coordinate &coor);private:int m_iX;int m_iY;
    };// Coordinate.cpp
    Coordinate operator+(const Coordinate &coor) {Coordinate tempCoor;tempCoor.m_iX = this->m_iX + coor.m_iX;tempCoor.m_iY = this->m_iY + coor.m_iY;return tempCoor;
    }// main.cpp
    int main() {Coordinate coor1(3, 5);Coordinate coor2(4, 6);Coordinate coor3(0, 0);coor3 = coor1 + coor2;    // coor3 = coor1.operator+(coor2);return 0;
    }

Ⅱ <<号的重载

  • 友元函数重载

    // Coordinate.hpp
    #include <ostream>
    using namespace std;
    class Coordinate {friend ostream &operator<<(ostream &output, const Coordinate &coor);public:Coordinate(int x, int y);private:int m_iX;int m_iY;
    };// Coordinate.cpp
    ostream &operator<<(ostream &output, const Coordinate &coor) {output << coor.m_iX << ", " << coor.m_iY << endl;return output;
    }// main.cpp
    int main() {Coordinate coor(3, 5);cout << coor; // operator<<(cout, coor);return 0;
    }
  • 输出运算符可以采用成员函数重载吗?

    不可以。

    因为重载输出运算符的第一个参数必须是ostream &out,而若写成成员函数必须是this指针。

Ⅲ [](索引)的重载

// Coordinate.hpp
class Coordinate {public:Coordinate(int x, int y);  int operator[](int index);private:int m_iX;int m_iY;
};// Coordinate.cpp
int operator[](int index) {if(index == 0)return m_iX;if(index == 1)return m_iY;
}// main.cpp
int main() {Coordinate coor(3, 5);cout << coor[0];  // coor.operator[](0);cout << coor[1];  // coor.operator[](1);return 0;
}
  • 索引运算符可以采用友元函数重载吗?

    不可以。

    因为索引运算符的第一个参数必须是this指针。

转载于:https://www.cnblogs.com/xiaoqingyang/p/6077603.html

4.0 C++远征:重载运算符相关推荐

  1. C++ 重载运算符简单举例

    我们可以重定义或重载大部分 C++ 内置的运算符.这样,就能使用自定义类型的运算符. 重载的运算符是带有特殊名称的函数,函数名是由关键字 operator 和其后要重载的运算符符号构成的.与其他函数一 ...

  2. 【C++】重载运算符(一)

    1.1 重载运算符特点 重载运算符本质上是一次函数调用 除了operator() 运算符调用外,其他重载运算符不能含有默认参数. 当重载的运算符是成员函数时,this绑定到左侧运算对象.成员运算符函数 ...

  3. C++中自定义比较函数和重载运算符总结

    sort 自定义比较函数 //示例 struct node{int x, y; };bool cmp(const node& a, const node& b){return a.x ...

  4. 【C++ 语言】面向对象 ( 函数重载 | 运算符重载 | 运算符重载两种定义方式 | 拷贝构造方法 | RVO 优化 | NRVO 优化 )

    文章目录 函数重载 运算符重载 ( 类内部定义云算符重载 ) 运算符重载 ( 类外部定义运算符重载 ) 可重载的运算符 拷贝构造方法 编译器优化 ( RVO 优化 | NRVO 优化 ) 完整代码示例 ...

  5. C++——重载运算符和重载函数

    重载运算符和重载函数 C++ 中的函数重载 C++ 中的运算符重载 C++ 一元运算符重载 C++ 二元运算符重载 C++ 关系运算符重载 C++ 输入/输出运算符重载 C++ 赋值运算符重载 C++ ...

  6. [YTU]_2442( C++习题 矩阵求和--重载运算符)

    题目描述 有两个矩阵a和b,均为2行3列.求两个矩阵之和.重载运算符"+",使之能用于矩阵相加(如c=a+b). 重载流插入运算符"<<"和流提取运 ...

  7. [YTU]_2440( C++习题 复数类--重载运算符+,-,*,/)

    题目描述 定义一个复数类Complex,重载运算符"+","-","*","/",使之能用于复数的加.减.乘.除.运算符 ...

  8. [YTU]_2441( C++习题 复数类--重载运算符2+)

    题目描述 定义一个复数类Complex,重载运算符"+",使之能用于复数的加法运算.参加运算的两个运算量可以都是类对象,也可以其中有一个是整数,顺序任意.例如,c1+c2,i+c1 ...

  9. [YTU]_2439( C++习题 复数类--重载运算符+)

    题目描述 定义一个复数类Complex,重载运算符"+",使之能用于复数的加法运算.将运算符函数重载为非成员.非友元的普通函数.编写程序,求两个复数之和. 输入 两个复数 输出 复 ...

最新文章

  1. 计算机组成原理 — 总线系统
  2. levelDB数据库使用及实例 - 高性能nosql存储数据库
  3. python dict常用操作
  4. oracle主键跟踪,Oracle根据主键查找外键
  5. LeetCode Algorithm 274. H 指数
  6. 为什么修改了ie级别里的activex控件为启用后,还是无法下载,显示还是ie级别设置太高?
  7. 财付通php接口,dedecms 财付通接口,dedecms财付通_PHP教程
  8. 特征筛选5——距离相关系数筛选特征(单变量筛选)
  9. π型滤波频率计算_一文看懂π型滤波电路原理
  10. Linux基本命令 帮助命令
  11. 雅虎JavaScript架构师:网页开发技术安全优先
  12. gcc详解以及静态,动态库的生成 2
  13. Android Error:warning: Ignoring InnerClasses attribute for an anonymous inner class
  14. js判断文件后缀名方法
  15. 使用Dreamweaver进行一个简单的图文混排1/HTML
  16. android 脚本不被杀死,fgo用自动刷脚本会不会封号无需安卓
  17. 土木工程考研和计算机考研哪个,土木工程考研还是就业
  18. Unity 中 print 和 Debug.Log 的区别
  19. Python算法题笔记
  20. 2018中国人工智能企业排行(前50)

热门文章

  1. 网络规划设计培训与方案集下载
  2. PHP的命令行脚本调用
  3. 详解DNS的常用记录(下):DNS系列之三
  4. Solidity语言
  5. dhcp动态主机配置协议
  6. java集合总结_Java中集合总结
  7. web前端开发培训完就业前景怎么样
  8. Ubuntu中Could not get lock /var/lib/dpkg/lock解决方案
  9. 90 后 CTO 创业 6 年,做了一件改变互联网的“小事”
  10. Spring Cloud云架构 - SSO单点登录之OAuth2.0登录流程(2)