• C++ Tutorials: C++ Language: Classes: Classes (II)


    C++官方参考链接:Classes (II) - C++ Tutorials (cplusplus.com)

    类(II)
    重载操作符
    类本质上定义了C++代码中要使用的新类型。C++中的类型不仅通过构造和赋值的方式与代码交互。它们还通过操作符进行交互。例如,对基本类型执行以下操作:
    int a, b, c;
    a = b + c;
    在这里,基本类型(int)的不同变量分别应用加法操作符和赋值操作符。对于基本算术类型,此类操作的含义通常是明显和明确的,但对于某些类类型则可能不是这样。例如:
    struct myclass {
      string product;
      float price;
    } a, b, c;
    a = b + c;
    在这里,对b和c的+操作的结果并不明显。事实上,这段代码本身就会导致编译错误,因为类型myclass没有为+定义的行为。然而,C++允许大多数操作符被重载,因此几乎可以为任何类型(包括类)定义它们的行为。下面是所有可以重载的操作符的列表:

    Overloadable operators(可重载的操作符)
    1. + - * / = < > += -= *= /= << >>
    2. <<= >>= == != <= >= ++ -- % & ^ ! |
    3. ~ &= ^= |= && || %= [] () , ->* -> new
    4. delete new[] delete[]

    操作符通过operator函数重载,这些函数是具有特殊名称的普通函数:它们的名称以operator关键字开头,后面跟着重载的操作符符号。它的语法是:
    type operator sign (parameters) { /*... body ...*/ }
    例如,笛卡儿向量是两个坐标的集合:x和y。两个笛卡儿向量的加法操作被定义为两个x坐标相加,两个y坐标相加。例如,将笛卡尔向量(3,1)和(1,2)相加得到(3+1,1+2)=(4,3)。这可以在C++中通过以下代码实现: 
    // overloading operators example
    #include
    using namespace std;

    class CVector {
      public:
        int x,y;
        CVector () {};
        CVector (int a,int b) : x(a), y(b) {}
        CVector operator + (const CVector&);
    };

    CVector CVector::operator+ (const CVector& param) {
      CVector temp;
      temp.x = x + param.x;
      temp.y = y + param.y;
      return temp;
    }

    int main () {
      CVector foo (3,1);
      CVector bar (1,2);
      CVector result;
      result = foo + bar;
      cout << result.x << ',' << result.y << '\n';
      return 0;
    }

    如果对CVector的这么多出现感到困惑,请考虑其中一些引用了类名(即类型)CVector,而其他一些是具有该名称的函数(即构造函数,必须与类具有相同的名称)。例如:
    CVector (int, int) : x(a), y(b) {}  // function name CVector (constructor)
    CVector operator+ (const CVector&); // function that returns a CVector  
    CVector类的函数operator+重载该类型的加法操作符(+)。一旦声明了,这个函数可以使用操作符隐式调用,也可以使用函数名显式调用:
    c = a + b;
    c = a.operator+ (b);

  • 相关阅读:
    Java学习 - MySQL视图的练习 实例
    使用wireshark分析tcp握手过程
    JVM内存模型
    MIT6.824-lab3B-Key/value service with snapshots(实现快照的KV服务)
    使用 Spring Cloud Loadbalancer 实现客户端负载均衡
    串口转HID键鼠功能芯片CH9329应用指南
    金仓数据库 KingbaseGIS 使用手册(5. 使用几何对象:构建应用)
    linux mysql 连接出现“too many connections”问题解法
    web前端课程设计 HTML+CSS+JavaScript旅游风景云南城市网页设计与实现 web前端课程设计代码 web课程设计 HTML网页制作代码
    这个Python读取文件的方法,堪称天花板级别...
  • 原文地址:https://blog.csdn.net/weixin_40186813/article/details/126899193