当前位置: 首页 > news >正文

C++类的运算符重载

1、加号运算符重载(加减乘除)

首先假设你有一个Person类,里面有个成员变量m_a和m_b,现在你想使p1+p2等价于p1.m_a+p2.m_a,p1.m_b+p2.m_b

class Person {
public:Person() {};Person(int a, int b) : m_a(a), m_b(b) {}
  // +运算需要两个操作数,一个是this,另一个需要传参Person operator+(const Person& p) {Person temp(0, 0);temp.m_a = this->m_a + p.m_a;temp.m_b = this->m_b + p.m_b;return temp;} public:int m_a;int m_b; };

C++提供了一种函数来重载各种运算符,即operator紧跟你要重载的运算符,以上的operator+是在类内重载加号运算符,可以通过以下方式调用:

Person p1(10, 20);
Person p2(10, 20);
Person p3 = p1 + p2;

触类旁通可以写出全局重载

// 直接传入两个相加的操作数
Person operator+(const Person& p1, const Person& p2) {Person temp(0, 0);temp.m_a = p1.m_a + p2.m_a;temp.m_b = p1.m_b + p2.m_b;return temp; }

 2.左移运算符重载

<<的作用是输出,比如cout << p << endl;

建议使用全局重载

// 返回类型为ostream的引用,是为了链式调用,即cout << p执行完后,返回当前cout,继续执行<<endl;
ostream& operator<<(ostream& cout, Person& p) {cout << "m_a = " << p.m_a << endl;cout << "m_b = " << p.m_b << endl;return cout; }

因为其重载的本质调用是operator<<(cout, p),可以简化为cout << p,这是正常顺序,而若是在类内重载,其实现如下:

ostream& operator<<(ostream& cout) {cout << "m_a = " << this->m_a << endl;cout << "m_b = " << this->m_b << endl;return cout;
}

而其调用本质则为p.operator<<(cout),简化为p << cout,虽然可以用,但并不建议这么写:)

3、自增运算符重载(自减)

前自增

// ++(++a)也属于链式调用,所以要返回引用,使其返回本身
Person& operator++() {m_a++;m_b++;return *this; }

后自增

// (a++)++也属于链式调用,但因其“先输出后自增”的特点,使得在自增完成后返回的是自增前本身的副本,对于局部变量要返回值触发拷贝构造。
Person operator++(int) {//int占位Person temp = *this;m_a++;m_b++;return temp; }

4、赋值运算符重载

赋值运算符常见形式为Person p2 = p1,默认的赋值运算会将p1的成员变量一分不动的赋值到p2,也就是浅拷贝,若是有引用变量,则有可能导致析构函数内重复释放的问题,解决办法是手动重载赋值运算符为深拷贝。

// a = b = c,赋值的链式调用,也就是c赋值给b后返回自身b,再赋值给a,所以要返回引用类型
Person& operator=(Person& p) {if (p_data != NULL) {delete p_data;p_data = NULL:}p_data = new int(*p.p_data);return *this;
}

5、比较运算符重载

bool operator==(Person& p) {// 比较返回
}
bool operator!=(Person& p) {// 比较返回
}

6、函数调用运算符重载

即()运算符重载

void operator()(string text) {cout << text << endl;
}

可以通过以下方式调用:

p("Hello");

因其类似函数调用,也被称为仿函数

http://www.hskmm.com/?act=detail&tid=33868

相关文章:

  • 10.18 CSP-S模拟34/2025多校CSP模拟赛6 改题记录
  • 微软Office LTSC 2021(KpoJIuK直装版)x64 v16.0.14334.20344 10月版
  • 征程 6 | 征程 6 工具链如何支持 Matmul/Conv 双 int16 输入量化?
  • 结对项目:自动生成小学四则运算题目的命令行程序
  • 做题技巧与结论证明
  • 1. 两数之和
  • CSP-S模拟34/2025多校冲刺CSP模拟赛6
  • PostgreSQL 逻辑结构
  • 随机数技术
  • Java学习通互评5
  • 卡车厂实习第三天
  • 第六周作业---定时器
  • 『普及』浅谈图的基础
  • 被C语言链表折磨的一天 Σ( △ |||)︴
  • 运筹学在供应链优化中的实际应用
  • P6715 [CCO 2018] Fun Palace 题解
  • WebGL学习及项目实战(第03期:绘制多个点,线,面)
  • CF 359D. Pair of Numbers
  • 2025多校CSP模拟赛6
  • Java基础——类型转换,变量、常亮、作用域,基本运算符
  • 洛谷 LGR-246 S 模拟赛
  • godot3D节点本身的偏转数值错误竟会导致空间移动穿模??!
  • 题解:qoj7938 Graph Race
  • java中的初等函数
  • 分治算法
  • 专用硬件神经网络优化技术解析
  • 学习逆向的背景知识(自用)
  • Linux-网络安全私房菜(二)
  • pycharm使用远程的ssh的解释器
  • Android SSL Pinning检测利器:SSLPinDetect技术解析