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

什么是运算符重载

运算符重载,就是对已有的运算符重新进行定义,赋予其另一种功能,以适应不同的数据类型,本质上是函数重载。以下为您详细介绍:

 

实现原理与方式

 

- 原理:把指定的运算表达式转化为对运算符函数的调用,将运算符对象转化为运算符函数的实参,然后在编译过程中,根据实参的类型确定需要调用的函数 。其函数名字由关键字 operator 及其紧跟的运算符组成,比如重载 + 运算符的函数名为 operator+  。

- 实现方式

- 成员函数重载:将运算符重载为类的成员函数,此时函数的参数个数比该运算符实际操作数少1 个(一元运算符除外),因为其中一个操作数就是调用该函数的对象本身(通过 this 指针隐式传递) 。例如在C++中定义一个复数类 Complex  ,重载 + 运算符实现复数相加:

 

class Complex {

private:

    double real;

    double imag;

public:

    Complex(double r = 0.0, double i = 0.0) : real(r), imag(i) {}

    Complex operator+(const Complex& other) {

        return Complex(real + other.real, imag + other.imag);

    }

};

 

 

- 友元函数重载:通过 friend 关键字声明为类的友元函数来重载运算符。友元函数不属于类的成员函数,但能访问类的私有成员。对于双目运算符重载为友元函数,参数个数与操作数个数相同,这样可以使用交换律。比如:

 

class Complex {

private:

    double real;

    double imag;

public:

    Complex(double r = 0.0, double i = 0.0) : real(r), imag(i) {}

    friend Complex operator+(const Complex& c1, const Complex& c2);

};

Complex operator+(const Complex& c1, const Complex& c2) {

    return Complex(c1.real + c2.real, c1.imag + c2.imag);

}

 

 

- 普通函数重载:在类外定义普通函数进行运算符重载,同样要求至少有一个操作数是用户自定义类型。例如:

 

class Complex {

public:

    double real;

    double imag;

    Complex(double r = 0.0, double i = 0.0) : real(r), imag(i) {}

};

Complex operator+(const Complex& c1, const Complex& c2) {

    return Complex(c1.real + c2.real, c1.imag + c2.imag);

}

 

 

可重载运算符与限制

 

- 可重载运算符 :在C++中,除成员访问运算符“.”、作用域运算符“::”、 sizeof 运算符和三目运算符“?:”等少数运算符外,大多数运算符都可重载 。包括算术运算符(+、-、*、/ 等)、位操作运算符(&、|、~ 等)、逻辑运算符(! 等)、比较运算符(<、>、== 等)、赋值运算符(=、+=、-= 等)以及其他运算符(()、[]、-> 等 )。

- 限制

- 重载后的运算符不能改变其优先级和结合性,也不能改变操作数的个数及语法结构 。

- 不能改变运算符用于内部类型对象的含义 。

- 运算符重载是针对新类型数据的实际需要对原有运算符进行适当改造,重载功能应与原有功能类似 。

- 重载运算符的函数不能有默认参数,否则会改变运算符参数个数 。

- 重载的运算符操作数至少有一个是用户自定义类型 。

 

应用场景

 

- 自定义数据类型运算:比如自定义的复数类、矩阵类等,通过重载运算符实现这些自定义类型对象间的加减乘除等运算,让代码更直观、易读 。例如对于矩阵类,重载 + 运算符实现矩阵相加:

 

class Matrix {

    // 矩阵相关成员变量

    int rows, cols;

    int** data;

public:

    Matrix(int r, int c) : rows(r), cols(c) {

        data = new int*[rows];

        for (int i = 0; i < rows; ++i) {

            data[i] = new int[cols];

        }

    }

    Matrix operator+(const Matrix& other) {

        Matrix result(rows, cols);

        for (int i = 0; i < rows; ++i) {

            for (int j = 0; j < cols; ++j) {

                result.data[i][j] = data[i][j] + other.data[i][j];

            }

        }

        return result;

    }

    // 其他成员函数

};

 

 

- 输入输出操作:通过重载输入流运算符 >> 和输出流运算符 <<  ,方便自定义类型对象的输入输出。比如:

 

class Complex {

private:

    double real;

    double imag;

public:

    Complex(double r = 0.0, double i = 0.0) : real(r), imag(i) {}

    friend std::istream& operator>>(std::istream& in, Complex& c);

    friend std::ostream& operator<<(std::ostream& out, const Complex& c);

};

std::istream& operator>>(std::istream& in, Complex& c) {

    in >> c.real >> c.imag;

    return in;

}

std::ostream& operator<<(std::ostream& out, const Complex& c) {

    out << "(" << c.real << ", " << c.imag << ")";

    return out;

}

 

 

这样就可以像使用基本数据类型一样,用 cin >> complexObj 和 cout << complexObj 来输入输出复数对象。

http://www.xdnf.cn/news/261937.html

相关文章:

  • word怎么删除空白页?word最后一页删不掉怎么办
  • 基于开源AI大模型与AI智能名片S2B2C商城小程序的线上活动执行优化研究
  • SQL中的Subquery CTE Temporary Table 区别
  • HTTP基础介绍+OSI七层参考模型+HTTP协议介绍
  • 【Elasticsearch】实现气象数据存储与查询系统
  • 总账业务数据——Part 1
  • 单片机嵌入式CAN库
  • 在 Ubuntu 上安装 cPanel
  • 【Qt】初识Qt
  • 【科研绘图系列】R语言绘制世界地图(map plot)
  • 在多线程环境下如何设计共享数据结构保证原子操作与数据一致性
  • 第十章:反击的序曲(续)
  • JavaScript性能优化实战(8):缓存策略与离线优化
  • JavaScript:pc端网页特效--元素偏移量offset系列
  • flask 获取各种请求数据:GET form-data x-www-form-urlencoded JSON headers 上传文件
  • 每天学一个 Linux 命令(35):dos2unix
  • SMT贴片检验标准核心要点与实施规范
  • MySQL进阶(三)
  • 欺骗单页应用(SPA)渲染隐藏路由 -- trouble at the spa b01lersCTF
  • Ubuntu 24.04 完整Docker安装指南:从零配置到实战命令大全
  • NuttX 与 PX4 系统开发全流程详解
  • 《AI大模型应知应会100篇》第46篇:大模型推理优化技术:量化、剪枝与蒸馏
  • 基于 SAFM 超分辨率上采样模块的 YOLOv12 改进方法—模糊场景目标检测精度提升研究
  • 一、大模型原理:第一步分词Tokenization
  • MySQL数据操作全攻略:DML增删改与DQL高级查询实战指南
  • hadoop存储数据文件原理
  • 微服务设计约束
  • 介绍 PHP-FPM 和 Python WSGI
  • 【Bootstrap V4系列】学习入门教程之 组件-按钮(Buttons)
  • 宝塔docker拉取仓库失败