前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >【Example】C++ 运算符重载

【Example】C++ 运算符重载

原创
作者头像
芯片烤电池
修改于 2022-04-28 02:07:16
修改于 2022-04-28 02:07:16
84300
代码可运行
举报
文章被收录于专栏:C++教程C++教程
运行总次数:0
代码可运行

首先,阅读之前要先搞清楚什么是运算符、函数重载。函数重载就是在一个范围内为一个函数声明多个实现方式,函数名必须一致。

那么C++运算符是否可以重载呢?可以!先弄清什么时候需要进行运算符重载:

假设,你有一个类或者结构体,想通过 +、-、*、/ 这种最基本的运算符直接进行计算,又或者想用 ==、|| 直接进行比较。

这时候运算符重载的作用就来了。

C++运算符重载的核心是:operator 关键字

C++当中的运算符重载是通过 operator 关键字来实现的,当你定义了类或结构体后,编译器肯定无法智能地对类本身进行运算及比较。

因此,需要根据实际需要进行运算符的重载。

下面一段代码是在一个类中对 = 进行了一个最简单的重载:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
void operator=(const DataPack &in) {
     this->name = in.name;
     this->value = in.value;
};

可以看到,运算符重载也是一个简单的函数,它也有返回值类型、参数。

只不过它的函数名被强制要求为了【operator 关键字 + 要重载的运算符】

运算符重载的目的,就是为了实现自定义数据类型对运算符作用的支持。

既然重载了运算符,那么返回值与参数必须与运算符本意相匹配,否则编译器会报错:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
【正确】
bool operator==(const DataPack &in) {
       return this->value == in.value;
};

【错误】
void operator>=(const DataPack &in) {

};

重载运算符的函数体,就是对运算符作用的自定义实现:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
DataPack operator+(const DataPack &in) {
     DataPack out;
     out.name = this->name;
     out.value = this->value + in.value;
     return out;
};

那么有哪些运算符可以重载呢?

分类

运算符列表

双目算术运算符

+ (加),-(减),*(乘),/(除),% (取模)

关系运算符

==(等于),!= (不等于),< (小于),> (大于),<=(小于等于),>=(大于等于)

逻辑运算符

||(逻辑或),&&(逻辑与),!(逻辑非)

单目运算符

+ (正),-(负),*(指针),&(取地址)

自增自减运算符

++(自增),--(自减)

位运算符

| (按位或),& (按位与),~(按位取反),^(按位异或),,<< (左移),>>(右移)

赋值运算符

=, +=, -=, *=, /= , % = , &=, |=, ^=, <<=, >>=

空间申请与释放

new, delete, new[ ] , delete[]

其他运算符

()(函数调用),->(成员访问),,(逗号),[](下标)

不可重载的运算符:

运算符

说明

.

成员访问运算符

.* , ->*

成员指针访问运算符

::

域运算符

sizeof

长度运算符

?

条件运算符

#

预处理符号

部分可重载的运算符演示:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
class DataPack {
public:
    DataPack() {};
    DataPack(const string &n, int v) : name(n), value(v) {};

    /* --- 算术运算符重载 --- */
    DataPack operator+(const DataPack &in) {
        DataPack out;
        out.name = this->name;
        out.value = this->value + in.value;
        return out;
    };

    DataPack operator*(const DataPack& in) {
        DataPack out;
        out.name = this->name;
        out.value = this->value * in.value;
        return out;
    };

    /* --- 赋值运算符重载 --- */
    void operator=(const DataPack &in) {
        this->name = in.name;
        this->value = in.value;
    };

    void operator+=(const DataPack &in) {
        this->value += in.value;
    };

    /* --- 关系运算符重载 --- */
    bool operator==(const DataPack &in) {
        return this->value == in.value;
    };

    bool operator>=(const DataPack &in) {
        return this->value >= in.value;
    };

    /* --- 逻辑运算符重载 --- */
    bool operator&&(const DataPack& in) {
        return this->value == in.value;
    };

    bool operator!() {
        return this->value <= 0;
    };

    /* --- 自增减运算符重载 --- */
    void operator++() {
        this->value += 1;
    };

    void operator--() {
        this->value -= 1;
    };

    /* ---位运算符重载--- */
    bool operator&(const DataPack& in) {
        return this->value = in.value;
    }

    /* ---输入输出运算符重载--- */
    friend std::istream& operator>>(std::istream& in, DataPack& th) {
        in >> th.name >> th.value;
        return in;
    }

    friend std::ostream& operator<<(std::ostream& out, const DataPack& th) {
        out << th.name << th.value;
        return out;
    }

private:
    string name;
    int value = 0;

};

运算符全局重载:

除此之外,可以将运算符重载声明到类外部作为全局函数,便可以进行全局重载:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
class DataPack {
public:
    DataPack() {};
    DataPack(const string &n, int v) : name(n), value(v) {};

public:
    string name;
    int value = 0;
};

DataPack operator+(const DataPack& a, const DataPack& b) {
    DataPack out;
    out.name = a.name;
    out.value = a.value + b.value;
    return out;
};

但请注意,以下运算符只能作为成员函数进行重载:

运算符

说明

()

函数调用

[]

取下标

->

成员访问

=

赋值

重载运算符的注意事项:

1,重载运算符并不会改变运算符自身的优先级与结合性。

2,重载运算符并不会改变它的原有用法。

3,运算符重载函数不能有默认参数。

====================================

芯片烤电池 C++ Example 2022-Spring Season Pass :

【Example】C++ 标准库常用容器全面概述

【Example】C++ 回调函数及 std::function 与 std::bind

【Example】C++ 运算符重载

【Example】C++ 标准库智能指针 unique_ptr 与 shared_ptr

【Example】C++ 接口(抽象类)概念讲解及例子演示

【Example】C++ 虚基类与虚继承 (菱形继承问题)

【Example】C++ Template (模板)概念讲解及编译避坑

【Example】C++ 标准库 std::thread 与 std::mutex

【Example】C++ 标准库多线程同步及数据共享 (std::future 与 std::promise)

【Example】C++ 标准库 std::condition_variable

【Example】C++ 用于编译时封装的 Pimpl 演示 (编译防火墙 Private-IMPL)

【Example】C++ 单例模式 演示代码 (被动模式、兼容VS2022编译)

====================================

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
C++笔记:运算符重载
函数重载就是对一个已有的函数赋予新的含义,使之实现新功能,做到“一名多用”。 运算符也可以重载,在C++标准库中也使用了大量的运算符重载。例如:
DioxideCN
2022/08/05
1.5K0
C++中运算符重载详解
在C++编程中,运算符重载是一种强大的工具,它允许程序员改变已有运算符的行为,使其适应自定义类型。这篇文章将从基础开始,逐步深入到运算符重载的高级应用,帮助你从入门到精通。
码事漫谈
2024/12/27
3370
C++中运算符重载详解
(转载非原创)C++运算符重载介绍
C ++ 中预定义的运算符的操作对象只能是基本数据类型。但实际上,对于许多用户自定义类型(例如类),也需要类似的运算操作。这时就必须在C ++ 中重新定义这些运算符,赋予已有运算符新的功能,使它能够用于特定类型执行特定的操作。运算符重载的实质是函数重载,它提供了C ++ 的可扩展性,也是C ++ 最吸引人的特性之一。
xlj
2021/07/17
8780
C++:12---运算符重载
C++98,C++0x,C++11对“哪些运算符重载能够重载”有一致的规定。详细例如以下:
用户3479834
2021/02/03
6370
C++:12---运算符重载
九、运算符重载
运算符重载(Operator Overloading)是面向对象编程语言中的一种功能,它允许程序员为已存在的运算符(如 +, -, *, /, == 等)赋予新的意义,以便它们能够用于对象之间的操作。这种机制极大地提高了代码的可读性和易用性,因为它允许我们以更自然、更接近于数学表达式的方式来编写和操作对象。
用户11332765
2024/10/28
3050
C++面向对象学习之运算符重载(1)
运算符重载(函数重载)是C++多态的重要实现手段之一。通过运算符重载对运算符功能进行特殊定制,使其支持特定类型对象的运算,执行特定的功能,增强C++的扩展功能。
glm233
2020/09/28
9210
[C++] 类和对象:运算符重载
在C++中,运算符重载是一种强大的特性,它允许我们重新定义已有的运算符,以便用于用户自定义的数据类型。通过运算符重载,我们可以使得我们自定义的类对象像内置类型一样进行运算,这为编写清晰、简洁且易于理解的代码提供了便利。
DevKevin
2024/05/12
2220
[C++] 类和对象:运算符重载
C++之运算符重载(一)
C++支持运算符重载。运算符重载的好处是使得使用类的人更加方便。设计类的人只不过是把设计函数变成了设计运算符重载。因此,运算符重载的本质仍旧是一个函数。
zy010101
2020/04/08
4840
C++之运算符重载(一)
运算符重载
流操作符>>,<<一般使用非成员函数实现,也就是友元函数实现,这样可以符合程序员的惯性思维
DeROy
2020/05/11
1K0
C/C++对bool operator < (const p &a)const的认识,运算符重载详解(杂谈)
下面来进行这段代码的分析: struct node {  //定义一个结构体node(节点) int x; int y; int len;   //node中有3个成员变量x,y,len bool operator <(const node &a)const {//重载<操作符。可以对两个node使用<操作符进行比较 return len<a.len; } }; 括号中的const表示参数a对象不会被修改,最后的const表明调用函数对象不会被修改! 想必看到这里对重载运算符算是有一丁点的了解吧
Angel_Kitty
2018/04/08
2.6K0
C++ 重载运算符和重载函数
C++ 允许在同一作用域中的某个函数和运算符指定多个定义,分别称为函数重载和运算符重载。
狼啸风云
2020/10/28
2.3K0
8.4 C++ 运算符重载
C/C++语言是一种通用的编程语言,具有高效、灵活和可移植等特点。C语言主要用于系统编程,如操作系统、编译器、数据库等;C语言是C语言的扩展,增加了面向对象编程的特性,适用于大型软件系统、图形用户界面、嵌入式系统等。C/C++语言具有很高的效率和控制能力,但也需要开发人员自行管理内存等底层资源,对于初学者来说可能会有一定的难度。
王 瑞
2023/10/21
2560
8.4 C++ 运算符重载
【C++指南】运算符重载详解
运算符重载是指为类(或结构体)的特定运算符提供自定义实现,使其能够作用于类的对象。重载的运算符可以保持其原有的语义,也可以定义新的语义。
倔强的石头_
2024/12/06
3810
C/C++开发基础——运算符重载
运算符重载在C++的特性中并不算很特别,这次把它单独拿出来作为一个章节是想借助运算符重载的一些样例来回顾一下C++的一些语法特性,代码量比较多,但是都很经典。
Coder-ZZ
2023/11/21
2040
C/C++开发基础——运算符重载
【C++】运算符重载
注:最后有面试挑战,看看自己掌握了吗 文章目录 C++ 中的运算符重载 🍃博主昵称:一拳必胜客 特别鸣谢:木芯工作室 、Ivan from Russia ---- C++ 中的运算符重载 您可以重定义或重载大部分 C++ 内置的运算符。这样,您就能使用自定义类型的运算符。 重载的运算符是带有特殊名称的函数,函数名是由关键字 operator 和其后要重载的运算符符号构成的。与其他函数一样,重载运算符有一个返回类型和一个参数列表。 Box operator+(const Box&);
20岁爱吃必胜客
2022/11/13
6440
使用重载运算符实现一个复数类(C++实验十)
实验目的: 1.掌握用成员函数重载运算符的方法 2.掌握用友元函数重载运算符的方法
用户7886150
2021/02/08
1.6K0
C++ 运算符重载
本文引用于“C语言中文网”,我整理出来放在博客,方便大家共同学习。所有知识点和代码均已亲测可用,如有疑问,可提出,一起讨论学习。
用户7886150
2021/02/04
1.3K0
C++(运算符重载+赋值拷贝函数+日期类的书写)
由于赋值操作我们改变的是调用这个函数的对象,所以我们在参数中可以加上cosnt修饰,传值和传引用,我们选择传引用,最后返回也返回引用,这样可以避免调用拷贝构造函数
用户11305458
2024/10/09
1500
C++(运算符重载+赋值拷贝函数+日期类的书写)
【C++类和对象(中)】—— 我与C++的不解之缘(四)
        构造函数,是特殊的成员函数;这里需要注意,虽然名字叫做构造函数,但是构造函数的主要任务不是开辟空间创建对象(我们经常使用的局部对象是栈帧创建时,空间就已经开辟 好了),而是对象实例化时初始化对象。
星辰与你
2024/10/17
1710
【C++类和对象(中)】—— 我与C++的不解之缘(四)
类与对象 中(剩余部分) 以及 日历
• 当运算符被⽤于类类型的对象时,C++语⾔允许我们通过运算符重载的形式指定新的含义。C++规定类类型对象使⽤运算符时,必须转换成调⽤对应运算符重载,若没有对应的运算符重载,则会编译报错。 • 运算符重载是具有特名字的函数,他的名字是由operator和后⾯要定义的运算符共同构成。和其他函数⼀样,它也具有其返回类型和参数列表以及函数体。 • 重载运算符函数的参数个数和该运算符作⽤的运算对象数量⼀样多。⼀元运算符有⼀个参数,⼆元 运算符有两个参数,⼆元运算符的左侧运算对象传给第⼀个参数,右侧运算对象传给第⼆个参数。 • 如果⼀个重载运算符函数是成员函数,则它的第⼀个运算对象默认传给隐式的this指针,因此运算符重载作为成员函数时,参数⽐运算对象少⼀个。 • 运算符重载以后,其优先级和结合性与对应的内置类型运算符保持⼀致。 • 不能通过连接语法中没有的符号来创建新的操作符:⽐如operator@。 • .* :: sizeof ?: . 注意以上5个运算符不能重载。(选择题⾥⾯常考,⼤家要记⼀下) • 重载操作符⾄少有⼀个类类型参数,不能通过运算符重载改变内置类型对象的含义,如: int operator+(int x, int y) • ⼀个类需要重载哪些运算符,是看哪些运算符重载后有意义,⽐如Date类重载operator-就有意 义,但是重载operator+就没有意义。
2024/10/10
1270
相关推荐
C++笔记:运算符重载
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验