博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
4.0 C++远征:重载运算符
阅读量:4633 次
发布时间:2019-06-09

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

目录

重载运算符

四、重载运算符

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

本质 : 函数重载。

关键字 : operator

1.一元运算符重载

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

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

  • 友元函数重载

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

  • 成员函数重载

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

Ⅱ ++符号的重载

  • 前置++符号重载

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

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

2.二元运算符重载

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

Ⅰ +(加号)的重载

  • 友元函数重载

    // Coordinate.hppclass Coordinate {  friend Coordinate operator+(const Coordinate &coor1, const Coordinate &coor2);  public:    Coordinate(int x, int y);  private:    int m_iX;    int m_iY;};// Coordinate.cppCoordinate 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.cppint main() {  Coordinate coor1(3, 5);  Coordinate coor2(4, 6);  Coordinate coor3(0, 0);  coor3 = coor1 + coor2;    // coor3 = operator+(coor1, coor2);  return 0;}

  • 成员函数重载

    // Coordinate.hppclass Coordinate {  public:    Coordinate(int x, int y);    Coordinate operator+(const Coordinate &coor);  private:    int m_iX;    int m_iY;};// Coordinate.cppCoordinate 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.cppint 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 
    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.cppostream &operator<<(ostream &output, const Coordinate &coor) { output << coor.m_iX << ", " << coor.m_iY << endl; return output;}// main.cppint main() { Coordinate coor(3, 5); cout << coor; // operator<<(cout, coor); return 0;}
  • 输出运算符可以采用成员函数重载吗?

    不可以。

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

Ⅲ [](索引)的重载

// Coordinate.hppclass Coordinate {  public:    Coordinate(int x, int y);      int operator[](int index);  private:    int m_iX;    int m_iY;};// Coordinate.cppint operator[](int index) {  if(index == 0)    return m_iX;  if(index == 1)    return m_iY;}// main.cppint 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

你可能感兴趣的文章
JS字符串转换成json对象。。。。
查看>>
yaml语法三大规则
查看>>
【HANA系列】SAP HANA的特点总结
查看>>
修改选中文字的背景色
查看>>
【CodeForces - 546C】Soldier and Cards (vector或队列)
查看>>
Ubuntu 18.04 初始化(server版本 )
查看>>
【BZOJ-1449&2895】球队收益&球队预算 最小费用最大流
查看>>
TCP与UDP
查看>>
FolderSync :The various features and how to use them
查看>>
LPC43xx SGPIO DMA and Interrupts
查看>>
《剑指offer》面试题16—反转链表
查看>>
multiprocessing模块
查看>>
复合数据类型,英文词频统计
查看>>
随手之题(水2)
查看>>
Day4 闭包、装饰器decorator、迭代器与生成器、面向过程编程、三元表达式、列表解析与生成器表达式...
查看>>
用vector实现二维向量
查看>>
小C的记事本(栈记录字符串)
查看>>
32道常见的Java基础面试题
查看>>
javase中HashMap迭代器的使用
查看>>
请求分页中的内存分配之续
查看>>