• 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 jsp+mysql+Spring的汽车出租平台租赁网站平台设计和实现
    Windows11右键添加新建markdown格式文件的几种方法
    Linux——几个重要的指令man、cp、mv、 cat、more、 less、find
    发展全球基于梯度的地下水模型,将其整合到全球水文模型中,面临的挑战
    Abnova丨CMV CISH 探头解决方案
    对思维进化的理解
    0103n阶行列式-行列式-线性代数
    纠错码与魔术(二)——魔术《矩阵感应》等
    【无标题】
    面试精选-前端
  • 原文地址:https://blog.csdn.net/weixin_40186813/article/details/126899193