C++运算符重载规则 算术运算符重载示例

C++中运算符重载允许为类类型定义算术运算行为,示例中Complex类通过成员函数重载+、-、*、/实现复数计算,遵循不改变优先级、使用const引用参数等规则,并通过友元函数重载

c++运算符重载规则 算术运算符重载示例

在C++中,运算符重载允许我们为自定义类型(如类或结构体)赋予标准运算符新的行为。算术运算符如 +*/ 等是最常被重载的运算符之一,用于实现对象之间的数学运算。

运算符重载基本规则

重载算术运算符需遵循以下规则:

不能改变运算符的优先级和结合性不能创建新的运算符,只能重载已有运算符部分运算符必须作为类的成员函数重载(如赋值 =、下标 []、函数调用 ()、成员访问 ->)算术运算符通常以成员函数或友元函数形式实现,推荐使用成员函数实现 +=, -= 等复合赋值运算符,而 +, – 等可使用友元或非成员函数基于复合赋值实现

算术运算符重载示例:复数类

以下是一个简单的复数类 Complex,演示如何重载 +、-、*、/ 运算符。

立即学习“C++免费学习笔记(深入)”;

#include using namespace std;

class Complex {private:double real;double imag;

public:// 构造函数Complex(double r = 0, double i = 0) : real(r), imag(i) {}

// 显示复数void display() const {    cout << "(" << real << " + " << imag << "i)";}// 重载加法运算符(成员函数)Complex operator+(const Complex& other) const {    return Complex(real + other.real, imag + other.imag);}// 重载减法运算符Complex operator-(const Complex& other) const {    return Complex(real - other.real, imag - other.imag);}// 重载乘法运算符Complex operator*(const Complex& other) const {    // (a+bi)(c+di) = (ac-bd) + (ad+bc)i    double r = real * other.real - imag * other.imag;    double i = real * other.imag + imag * other.real;    return Complex(r, i);}// 重载除法运算符Complex operator/(const Complex& other) const {    double denominator = other.real * other.real + other.imag * other.imag;    if (denominator == 0) {        cerr << "除零错误!n";        return Complex();    }    double r = (real * other.real + imag * other.imag) / denominator;    double i = (imag * other.real - real * other.imag) / denominator;    return Complex(r, i);}// 友元函数重载输出运算符friend ostream& operator<<(ostream& os, const Complex& c) {    os << "(" << c.real << " + " << c.imag << "i)";    return os;}

};

使用示例

测试上面定义的运算符重载功能:

int main() {    Complex c1(3, 4);  // 3 + 4i    Complex c2(1, 2);  // 1 + 2i
Complex sum = c1 + c2;Complex diff = c1 - c2;Complex prod = c1 * c2;Complex quot = c1 / c2;cout << "c1 = "; c1.display(); cout << endl;cout << "c2 = "; c2.display(); cout << endl;cout << "c1 + c2 = "; sum.display(); cout << endl;cout << "c1 - c2 = "; diff.display(); cout << endl;cout << "c1 * c2 = "; prod.display(); cout << endl;cout << "c1 / c2 = "; quot.display(); cout << endl;// 使用友元输出cout << "使用重载<<: " << c1 << endl;return 0;

}

关键点说明

几点需要注意:

算术运算符重载通常返回一个新的对象,而不是引用,因为结果是临时值参数使用 const 引用避免拷贝,提高效率成员函数形式的重载只有一个显式参数(右侧操作数),左侧是 *this对于对称操作(如 a + b),若希望支持隐式类型转换(如 int + Complex),建议使用非成员友元函数除法等可能出错的操作应加入必要检查

基本上就这些。掌握这些模式后,可以扩展到向量、矩阵、分数等类型的运算符重载。

以上就是C++运算符重载规则 算术运算符重载示例的详细内容,更多请关注创想鸟其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/1472419.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2025年12月18日 19:36:09
下一篇 2025年12月18日 19:36:20

相关推荐

  • C++数组查找元素 线性与二分查找实现

    线性查找适用于无序数组,时间复杂度O(n);二分查找效率高,时间复杂度O(log n),但要求数组有序。 在C++中查找数组中的元素,最常用的方法是线性查找和二分查找。它们各有适用场景:线性查找适用于无序数组,时间复杂度为O(n);二分查找效率更高,时间复杂度为O(log n),但要求数组必须有序。…

    2025年12月18日
    000
  • C++ weak_ptr作用是什么 解决循环引用方案

    weak_ptr不增加引用计数,用于打破shared_ptr循环引用。例如父子对象互相引用时,将子对象对父对象的引用改为weak_ptr,避免引用计数无法归零。访问时通过lock()临时获取shared_ptr,确保对象存活,防止内存泄漏。 weak_ptr 是 C++ 中用于管理动态内存的弱引用指…

    2025年12月18日
    000
  • C++模板调试技巧 编译错误诊断方法

    掌握C++模板调试需理解编译器实例化过程与错误信息,通过简化问题、使用static_assert、类型推导工具、编译选项优化、IDE调试、SFINAE、CRTP、错误信息分析、代码隔离、测试框架及搜索引擎等方法提升效率。 模板调试,那可真是C++程序员的噩梦之一。 编译错误信息又臭又长,定位问题犹如…

    2025年12月18日
    000
  • 如何减少C++异常处理开销 零成本异常实现原理剖析

    异常处理是否影响性能取决于使用方式和场景。若程序极少抛出异常,现代编译器的零成本机制确保无额外开销;但若频繁抛出异常则会导致性能下降。关键点包括:1. 不要用异常代替常规控制流;2. 避免在性能敏感代码中频繁抛出异常;3. 了解编译器优化策略。零成本机制通过异常信息表和栈展开实现,正常流程几乎无代价…

    2025年12月18日 好文分享
    000
  • C++this指针作用 当前对象引用使用场景

    this指针指向调用成员函数的当前对象,用于区分成员变量与参数、实现链式调用、防止自赋值及传递当前对象,是C++面向对象机制的核心组成部分。 this 指针是 C++ 中一个隐含的指针,它指向调用成员函数的当前对象实例。每个非静态成员函数都会自动接收到一个指向当前对象的 this 指针,它使得函数能…

    2025年12月18日
    000
  • C++虚假共享问题 缓存行填充解决方案

    虚假共享指多线程中独立变量因同属一个缓存行而引发频繁同步,降低性能;通过缓存行填充或alignas对齐使变量独占缓存行,可有效避免该问题。 在多线程C++程序中,即使变量是独立的,也可能因为它们在内存中靠得太近而引发性能问题。这种现象叫做“虚假共享”(False Sharing),它会显著降低程序的…

    2025年12月18日
    000
  • C++ deque容器原理 双端队列数据结构分析

    deque是分段连续存储的动态数组,支持两端高效插入删除和近似随机访问。它通过map管理多个缓冲区,避免了vector扩容时的全量复制,同时比list更利于缓存。与vector相比,deque在首尾增删更快,但不保证全局内存连续;与list相比,deque空间开销更小且支持随机访问。适用于需频繁在两…

    2025年12月18日
    000
  • C++结构体在嵌入式应用 寄存器映射实现

    C++结构体通过volatile关键字和内存打包指令实现硬件寄存器的类型安全映射,提升代码可读性与维护性,结合类封装、static_assert编译时检查及清晰命名可构建健壮的嵌入式驱动架构。 在嵌入式系统开发中,C++结构体提供了一种极其直观且类型安全的方式来映射硬件寄存器。它允许我们把分散的内存…

    2025年12月18日
    000
  • 适配器容器怎么使用 stack和queue实现原理

    std::stack和std::queue是适配器容器,基于底层容器(如deque、vector、list)提供受限接口,分别实现LIFO和FIFO语义,默认使用deque因其两端高效操作且缓存性能好。 std::stack 和 std::queue 并非独立的容器,它们是所谓的“适配器容器”。其核…

    2025年12月18日
    000
  • C++ string类操作 常用字符串处理方法

    C++ string类提供构造、赋值、访问、查找、替换等丰富操作,通过实例演示了长度获取、子串提取、内容替换等功能,并推荐使用stringstream或reserve提升大量字符串拼接效率,同时介绍string::npos用于表示查找失败,以及stoi/to_string等函数实现字符串与数值转换。…

    2025年12月18日
    000
  • C++建造者模式实现 分步构建复杂对象

    建造者模式通过分离复杂对象的构建与表示,使同一构造过程可创建不同对象。包含Product(报告)、Builder(抽象构建接口)、ConcreteBuilder(如HtmlReportBuilder)和Director(指挥构建流程)。示例中用ReportDirector指导HtmlReportBu…

    2025年12月18日
    000
  • 迭代器有哪几种类型 输入输出前向双向随机访问迭代器

    迭代器在c++++中是访问容器元素的抽象指针,分为输入、输出、前向、双向和随机访问五种类型,能力依次递增;输入迭代器支持单向读取,输出迭代器支持单向写入,前向迭代器可多次读写并支持多趟遍历,双向迭代器可在前后方向移动,随机访问迭代器支持指针算术运算和高效随机访问;迭代器类型决定了算法的适用性与性能,…

    2025年12月18日
    000
  • 函数对象是什么概念 重载operator()的类实例

    函数对象是通过重载operator()实现的可调用对象,能携带状态,常用于STL算法中传递带上下文的行为。与普通函数和Lambda相比,它支持状态保持、类型封装和复用,适用于自定义比较器、谓词及策略模式等场景。 函数对象,简单来说,就是一个行为像函数的对象。它通过在一个类里重载了括号操作符 oper…

    2025年12月18日
    000
  • C++智能指针数组 shared_ptr数组管理

    shared_ptr默认用delete而非delete[],导致数组析构时未定义行为。需显式指定删除器:如用lambda [](int p) { delete[] p; } 或C++20的std::make_shared(10)。访问元素需arr.get()[i]或(arr.get() + i)。但…

    2025年12月18日
    000
  • weak_ptr在什么场景使用 打破循环引用实际案例

    weak_ptr用于解决shared_ptr的循环引用问题,示例中A和B互相持有shared_ptr导致内存泄漏,将其中一个改为weak_ptr后打破循环,引用计数正常归零,对象可析构,weak_ptr通过lock()安全访问目标,常用于父子节点等场景。 在 C++ 中,weak_ptr 主要用于解…

    2025年12月18日
    000
  • 标准库抛出哪些异常 std exception类体系分析

    c++++标准库中的异常体系以std::exception为核心基类,所有标准异常均派生自它,用于构建健壮的异常处理机制。1. std::exception定义在头文件中,提供虚函数what()返回异常描述信息。2. 逻辑错误如std::logic_error及其子类std::domain_erro…

    2025年12月18日
    000
  • C++内存序类型 relaxed到seq_cst区别

    relaxed仅保证原子操作的原子性,不保证操作顺序,适合性能敏感且逻辑独立的场景;seq_cst提供全局一致的顺序保证,确保所有线程看到相同的操作序列,适合正确性优先的场景。两者核心区别在于对操作顺序的约束强度,选择需权衡性能与可预测性。 C++的 memory_order_relaxed 和 m…

    2025年12月18日
    000
  • C++14泛型lambda auto参数模板应用

    泛型lambda通过auto参数自动推断类型,避免了传统模板显式声明的冗余,使代码更简洁。例如,auto add = [](auto a, auto b) { return a + b; }; 比模板版本更短且易读。它在算法库(如std::transform)、函数式编程和通用比较函数中特别有用,可…

    2025年12月18日
    000
  • C++ if初始化语句 条件作用域控制改进

    C++17引入if和switch初始化语句以限制变量作用域,提升代码安全与可读性。1. 变量在if/switch条件中声明,作用域仅限语句块内,避免命名冲突与资源滥用。2. 支持智能指针等资源的自动管理,防止内存泄漏。3. 使代码更简洁,如结合find查找容器元素,无需提前声明迭代器。4. 过度使用…

    2025年12月18日
    000
  • C++文本编辑器开发 基础文件操作功能

    文件操作功能是C++文本编辑器核心,包括打开、读取、保存和另存为;2. 打开读取使用std::ifstream逐行读取并处理编码;3. 保存另存为使用std::ofstream写入内容并记录路径;4. 示例代码展示文件读写基本实现。 开发一个C++文本编辑器时,基础文件操作功能是核心部分,主要包括文…

    2025年12月18日
    000

发表回复

登录后才能评论
关注微信