C++(三)——运算符重载

news2024/11/17 9:48:35

运算符重载

重定义或重载大部分 C++ 内置的运算符就能使用自定义类型的运算符。

重载的运算符是带有特殊名称的函数,函数名是由关键字 operator 和其后要重载的运算符符号构成的。与其他函数一样,重载运算符有一个返回类型和一个参数列表。

不能为了重载而重载     重载之后的运算符和原来的使用方式特性一模一样

可重载的运算符列表

双目算术运算符	+ (加),-(减),*(乘),/(除),% (取模)

关系运算符	==(等于),!= (不等于),< (小于),> (大于),<=(小于等于),>=(大于等于)

逻辑运算符	||(逻辑或),&&(逻辑与),!(逻辑非)

单目运算符	+ (正),-(负),*(指针),&(取地址)

自增自减运算符	++(自增),--(自减)

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

赋值运算符	=, +=, -=, *=, /= , % = , &=, |=, ^=, <<=, >>=

空间申请与释放	new, delete, new[ ] , delete[]

其他运算符	()(函数调用),->(成员访问),,(逗号),[](下标)


不可重载的运算符列表

.              :成员访问运算符
->           :成员指针访问运算符
::            :域运算符
sizeof    :长度运算符
?:          :条件运算符
#           : 预处理符号

+ - 两个运算符的重载

#include <iostream>

using namespace std;

class dog 
{

    private:
        int weight ;
        string name;
    public:

        //构造函数
        dog(string name , int weight)
        {
            this->name = name ;
            this->weight = weight ;
        }

        //拷贝构造
        dog(const dog & obj)
        {
            this->name = obj.name;
            this->weight = obj.weight;

        }

        //移动
        dog(const dog && obj)
        {
            this->name = obj.name;
            this->weight = obj.weight;
        }

        //析够函数
        ~dog()
        {

        }

        //+两只狗体重之和
        dog & operator +(const dog & obj )
        {
            static dog temp(" ",1);
            temp.weight = this->weight + obj.weight;
            temp.name = this->name + "和" + obj.name;

            return temp;
        }

        //-两只狗体重之差
        dog & operator -(const dog & obj )
        {
            static dog temp(" ",1);
            temp.weight = this->weight - obj.weight;
            temp.name = this->name + "和" + obj.name+"体重相差";

            return temp;
        }

        friend ostream & operator <<(ostream & os , dog & obj );


};

//输出<<重载
ostream & operator <<(ostream & os , dog & obj )
{
    os<<"名字:"<<obj.name<<endl<<"体重:"<<obj.weight<<endl;
    return os;
}

int main()
{
    dog g1("土狗🐶",25);
    dog g2("小狗🐶",26);
    cout<<g1<<g2;

    
    cout<<g1+g2;
    
    cout<<g2-g1;

    return 0;
}

运行结果:
在这里插入图片描述


其他运算符实例代码

#include <iostream>
#include <cstring>


using namespace std;

class Arr
{
    private:
        char * arr;
        int len ;
        int size;

    public:
        //构造
        Arr(char * str)
        {
            len = strlen(str);
            size = len+1;
            arr = new char[size];
            strcpy(arr,str);
        }
        
        //拷贝构造🐶
        Arr(Arr & obj)
        {
        	arr = new char[obj.size];
            len = obj.len;
            size = obj.size;
            strcpy(arr,obj.arr);
        }

        //🐣移动构造🐶
        Arr(Arr && obj )
        {
            len = obj.len;
            size = obj.size;
            arr = obj.arr;
            obj.arr = nullptr;
        }
        
        //+=重载:两个字符串连接
        Arr & operator +=(const Arr &obj)
        {
            if(obj.len + this->len > this->size )
            {
                char * p = new char[obj.len+len+1];
                strcpy(p,arr);
                delete []arr;
                arr = p ;
                p = nullptr;
                size = obj.len+len+1;
            }
            strcat(arr,obj.arr);
            len = len + obj.len ;
            return *this;
        }

        //= 实现字符串复制功能🐮
        Arr & operator =(const Arr &obj)
        {
            if(obj.len > size )
            {
                char *p = new char[obj.size];
                strcpy(p,obj.arr);
                arr = p ;
                p = nullptr;
                size = obj.size;
            }
            else
            {
                strcpy(this->arr,obj.arr);
            }
            len = obj.len;

            return *this;
        }

        //[] 🏇
        char & operator [](const int i )
        {   
            return arr[i];
        }

        //()🦆
        void operator ()()
        {
            cout<<"hello new ()"<<endl;
        }

        friend ostream & operator <<(ostream & os , const Arr & obj);
        friend istream & operator >>(istream & is , const Arr & obj );


};
        

ostream & operator <<(ostream & os , const Arr & obj)
{
    os<<"data:"<<obj.arr<<endl<<"len ="<<obj.len<<endl<<endl<<"size="<<obj.size<<endl;
    return os;

}

istream & operator >>(istream & is , const Arr & obj )
{
    is>>obj.arr;

    return is;
}
int main()
{
    char buf[] = {"n牛🐮"};
    char buf1[] = {"m马🏇"};
    
    Arr a = buf;
    Arr b = buf1;

    cout<<a<<endl;
    a +=b;
    cout<<a<<endl;

    a=b;
    cout<<a<<endl;

    a[0]= 't';
    cout<<a<<endl;
    
    a();
    
    cin>>a;
    cout<<a<<endl;


}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1002067.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

GeoServer 安装及使用教程

GeoServer 安装及使用教程 一、前言二、安装1. 下载和安装Java2. 下载、安装、部署GeoServer3. 启动GeoServer4. 发布数据5. 结论 一、前言 GeoServer是一个开源的地理空间数据服务器&#xff0c;可以将地图数据发布为Web服务。在本篇教程中&#xff0c;我们将介绍如何安装GeoS…

B站:AB test [下]

Focus在&#xff1a;AB Test结束后&#xff0c;如何进行显著性检验&#xff1f;&#xff08;以判断改动是否有效果&#xff09; 引入&#xff1a;Z检验和T检验 而T检验适用于 n<30 的小样本 值得注意的是&#xff1a;统计上显著并不意味着现实中显著&#xff01; e.g. 加速…

Vue面试题以及解答(持续扩展中.....)

##Vue面试题## 1.组件中通讯方式有哪些 组件中通讯有$emit&#xff0c;props&#xff0c;vuex&#xff0c;provid和inject&#xff0c;$parent/$children&#xff0c;$refs&#xff0c;全局总线时间EvenBus&#xff0c;订阅与发布模式的subscrip/publish 2.Vue2和Vue3的区别…

尚硅谷大数据项目《在线教育之实时数仓》笔记001

视频地址&#xff1a;尚硅谷大数据项目《在线教育之实时数仓》_哔哩哔哩_bilibili 目录 P001 P002 P003 P004 P005 P001 以在线教育采集系统和离线数仓为前置基础&#xff0c;分为三个部分讲解&#xff1a;实时数仓架构介绍、数仓模型搭建、Suger可视化大屏展示。 P002 P0…

机票预定系统的软件工程分析报告

目 录 1 项目开发计划书……………………………………………………&#xff08;页码&#xff09; 2 软件需求规格说明书………………………………………………&#xff08;页码&#xff09; 3设计规格说明书……………………………………………………&#xff08;页码&…

uni-number-box的坑-无法实现数据双向绑定

业务场景&#xff1a;多规格商品----每一个规格定一个起购量&#xff0c;切换不同规格时动态改变起购数量。 代码&#xff1a; <uni-number-box class"step" ref"ChildComponents" :cid"productSku.productSkuUuid" :min"productSku.s…

STC8单片机PWM定时器+EC11编码器实现计数

STC8单片机PWM定时器+EC11编码器实现计数 📌相关篇《STC单片机+EC11编码器实现调节PWM输出占空比》📍《stc单片机外部中断+EC11编码器实现计数功能》🔖STC8系列支持此功能的型号: ✨从上面的相关篇中有通过通用定时器加外部中断以及常规方法实现驱动EC11编码器的方法。本…

Linux C++ 海康摄像头 Alarm Demo

项目结构 CMakeLists.txt cmake_minimum_required(VERSION 3.7)SET(CMAKE_BUILD_TYPE "Debug") SET(CMAKE_CXX_FLAGS_DEBUG "$ENV{CXXFLAGS} -O0 -Wall -g -ggdb") SET(CMAKE_CXX_FLAGS_RELEASE "$ENV{CXXFLAGS} -O3 -Wall")project(CapPicture…

大规模流量下的云边端一体化流量调度体系

/ 火山引擎是字节跳动旗下的云服务平台&#xff0c; 将字节跳动快速发展过程中积累的增长方法、技术能力和工具开放给外部企业&#xff0c;提供云基础、视频与内容分发、数智平台VeDI、 人工智能、开发与运维等服务&#xff0c;帮助企业在数字化升级中实现持续增长。LiveVid…

在 IntelliJ IDEA 中远程部署 Java 程序

文章目录 远程调试与远程部署的区别远程部署的步骤完整源代码 笔者的运行环境&#xff1a; 客户端&#xff1a; 部署成功过的客户端的 Java 版本&#xff1a; Java 17.0.7 部署成功过的客户端的 Java 程序&#xff1a; Spring Boot 3.1.0 部署成功过的客户端的 IntelliJ IDEA…

论文浅尝 | 思维树:使用大语言模型反复思考解决问题

笔记整理&#xff1a;许泽众&#xff0c;浙江大学博士&#xff0c;研究方向为知识图谱上的神经符号推理 链接&#xff1a;https://arxiv.org/abs/2305.10601 1. 动机 语言模型是一种强大的工具&#xff0c;可以用于各种需要数学、符号、常识或知识推理的任务。然而&#xff0c;…

初识MyBatis(一)基于配置文件下的一些增删改查

MyBatis可以使用简单的XML或注解用于配置和原始映射&#xff0c;将接口和Java的POJO&#xff08;Plain Old Java Objects&#xff0c;普通的Java对象&#xff09;映射成数据库中的记录 MyBatis 是一个 半自动的ORM&#xff08;Object Relation Mapping&#xff09;框架 创建好m…

手机+卫星的科技狂想

最近硬件圈最火热的话题之一&#xff0c;应该就是突然上线、遥遥领先的华为Mate 60 Pro了。 其中&#xff0c;CPU和类5G网速是怎么实现的&#xff0c;是大家特别关注的问题。相比之下&#xff0c;卫星通话这个功能&#xff0c;讨论度就略低一些&#xff08;没有说不火的意思&am…

62、SpringBoot 使用RestTemplate 整合第三方 RESTful 服务

这节的要点&#xff1a; 就是弄两个项目 &#xff0c; 从 端口9090 这个项目&#xff0c;通过 restTemplate&#xff0c; 去访问 端口8080 的项目&#xff0c;并获取8080项目的数据。 ★ RESTful服务包含两方面的含义 1. 自己的应用要暴露一些功能供别人来调用。此时我们是服…

postgresql-DML

DML 语句 创建示例表插入数据插入单行数据插入多行数据复制数据返回插入的数据 更新数据单表更新跨表更新返回更新后的数据 删除数据单表删除跨表删除返回被删除的数据 合并数据MERGE 语句INSERT ON CONFLICT DML 语句与 CTE 创建示例表 CREATE TABLE dept (department_id int…

面向Ai设计的Mojo编程语言支持下载,当前只有Linux系统版本

据了解&#xff0c;Mojo是Modular AI公司开发的专门面向AI设计的编程语言&#xff0c;号称比Python快68000倍。 Mojo现已开放本地下载运行&#xff0c;除了编译器之外&#xff0c;Mojo SDK还包括一整套开发者和IDE工具&#xff0c;并用来构建和迭代 Mojo应用。 公司方面表示&…

leetcode 589. N 叉树的前序遍历(java)

N 叉树的前序遍历 题目描述前序遍历后序遍历 题目描述 难度 - 简单 LC - 589.N叉树的前序遍历 给定一个 n 叉树的根节点 root &#xff0c;返回 其节点值的 前序遍历 。 n 叉树 在输入中按层序遍历进行序列化表示&#xff0c;每组子节点由空值 null 分隔&#xff08;请参见示例…

RK3399平台开发系列讲解(内核调试篇)USB摄像头快速测试

🚀返回专栏总目录 文章目录 一、检测设备二、安装必要的库三、 mjpeg-stream 安装四、实时预览沉淀、分享、成长,让自己和他人都能有所收获!😄 📢 本篇介绍如何快速测试 USB 摄像头。 一、检测设备 将 USB 摄像头插上,查看是否找到设备,输入指令:v4l2-ctl --list-d…

vuex中actions异步调用以及读取值

项目场景&#xff1a; 提示&#xff1a;这里简述项目相关背景&#xff1a; 将根据segmentId查出来的合同信息托管到vuex中&#xff0c;让每个人都可以获取到合同信息 描述以及问题点 1&#xff1a;调用vuex异步函数的语法是 this.$store.dispatch(actions方法名,值) 2&#…

JUC并发编程--------线程安全篇

目录 什么是线程安全性问题&#xff1f; 如何实现线程安全&#xff1f; 1、线程封闭 2、无状态的类 3、让类不可变 4、加锁和CAS 并发环境下的线程安全问题有哪些&#xff1f; 1、死锁 2、活锁 3、线程饥饿 什么是线程安全性问题&#xff1f; 我们可以这么理解&#…