研一寒假C++复习笔记--运算符重载实例

2023-10-29

目录

1--运算符重载

2--加号运算符重载(+)

3--左移运算符重载(<<)

4--递增运算符重载

5--赋值运算符重载

6--关系运算符重载

7--函数调用运算符重载


1--运算符重载

        对已有运算符重新进行定义,赋予其另一种功能,以适应不同的数据类型;

① 加号运算符重载

② 左移运算符重载

③ 递增运算符重载

④ 赋值运算符重载

⑤ 关系运算符重载

⑥ 函数调用运算符重载

2--加号运算符重载(+)

# include <iostream>

class Person{

public:
    // 通过成员函数重载 + 号
    Person operator+(Person &p){
        Person temp;
        temp.A = this->A + p.A;
        temp.B = this->B + p.B;
        return temp;
    }

    int A;
    int B;
};

// // 通过全局函数重载 + 号
// Person operator+(Person &p1, Person &p2){
//     Person temp;
//     temp.A = p1.A + p2.A;
//     temp.B = p1.B + p2.B;
//     return temp;
// }

// 运算符重载也可以进行函数重载
Person operator+(Person &p1, int val){
    Person temp;
    temp.A = p1.A + val;
    temp.B = p1.B + val;
    return temp;
}

int main(){
    Person p1;
    p1.A = 10;
    p1.B = 10;

    Person p2;
    p2.A = 10;
    p2.B = 10;

    // 成员函数重载的本质调用为: Person p3 = p1.operator+ + p2;
    // 全局函数重载的本质调用为: Person p3 = operator+(p1, p2);
    Person p3 = p1 + p2;
    std::cout << "p3.A = " << p3.A << std::endl;
    std::cout << "p3.B = " << p3.B << std::endl;

    Person p4 = p1 + 100;
    std::cout << "p4.A = " << p4.A << std::endl;
    std::cout << "p4.B = " << p4.B << std::endl;

    return 0;
}

3--左移运算符重载(<<)

# include <iostream>

class Person{

public:
    // 声明友元函数
    friend std::ostream& operator<<(std::ostream &cout, Person &p);

    // 有参构造函数
    Person(int a, int b){
        A = a;
        B = b;
    }
private:
    int A;
    int B;
};

// 只能利用全局函数重载 << 运算符
std::ostream& operator<<(std::ostream &cout, Person &p){
    std::cout << "A: " << p.A << ", B: " << p.B << std::endl;
    return cout;
}

int main(){
    // 调用有参构造初始化
    Person p(10, 10);

    // 本质调用:operator<<(cout, p)
    std::cout << p << p;
    return 0;
}

4--递增运算符重载

# include <iostream>

class MyInteger{

public:

    // 声明友元函数
    friend std::ostream& operator<<(std::ostream &cout, MyInteger p);

    MyInteger(){
        Num = 0;
    }

    // 重载前置++运算符
    MyInteger& operator++(){
        Num++;
        return *this; // 返回引用,一直对同一个数据进行操作
    }

    // 重载后置++运算符
    // int代表占位参数,用于区分前置和后置递增
    MyInteger operator++(int){
        MyInteger temp = *this; // 先记录自身
        Num++; // 再++
        return temp; // 返回引用,一直对同一个数据进行操作
    }

private:
    int Num;
};

// 只能利用全局函数重载 << 运算符
std::ostream& operator<<(std::ostream &cout, MyInteger p){
    std::cout << "Num: " << p.Num << std::endl;
    return std::cout;
}

int main(){
    MyInteger myint1;
    std::cout << myint1 << std::endl;
    std::cout << ++myint1 << std::endl;\

    MyInteger myint2;
    std::cout << myint2 << std::endl;
    std::cout << myint2++ << std::endl;
    std::cout << myint2 << std::endl;

    return 0;
}

5--赋值运算符重载

# include <iostream>

class Person{

public:
    Person(int age){
        Age = new int(age);
    }
    ~Person(){
        if (Age != NULL){
            delete Age;
            Age = NULL;
        }
    }

    // 重载赋值运算符
    Person& operator=(Person &p){
        // 编译器提供的浅拷贝
        // Age = p.Age;
        // 先判断是否有属性在堆区
        if (Age != NULL){
            delete Age;
            Age = NULL;
        }
        // 深拷贝
        Age = new int(*p.Age);
        return *this;
    }
    int *Age;
};

int main(){

    Person p1(10);
    Person p2(20);
    Person p3(30);
    p3 = p2 = p1; // 赋值操作
    std::cout << "p1.age: " << *p1.Age << std::endl;
    std::cout << "p2.age: " << *p2.Age << std::endl;
    std::cout << "p3.age: " << *p3.Age << std::endl;
    return 0;
}

6--关系运算符重载

# include <iostream>

class Person{

public:
    Person(std::string name, int age){
        Age = age;
        Name = name;
    }

    // 重载 == 号
    bool operator==(Person &p){
        if( Name == p.Name && Age == p.Age){
            return true;
        }
        return false;
    }

    // 重载 != 号
    bool operator!=(Person &p){
        if( Name == p.Name && Age == p.Age){
            return false;
        }
        return true;
    }

    int Age;
    std::string Name;
};

int main(){

    Person p1("ljf", 23);
    Person p2("zsy", 23);
    if(p1 == p2){
        std::cout << "p1 is equal to p2!" << std::endl;
    }
    else{
        std::cout << "p1 is not equal to p2!" << std::endl;
    }

    Person p3("ljf", 23);
    Person p4("zsy", 23);
    if(p3 != p4){
        std::cout << "p3 is not equal to p4!" << std::endl;
    }
    else{
        std::cout << "p3 is equal to p4!" << std::endl;
    }


    return 0;
}

7--函数调用运算符重载

# include <iostream>

class MyPrint{

public:
    // 重载函数调用运算符
    void operator()(std::string test){
        std::cout << test << std::endl;
    }
};

class MyAdd{

public:
    int operator()(int num1, int num2){
        return num1 + num2;
    }
};

int main(){

    MyPrint print;
    print("Hello, C++!"); // 类似于函数调用,所以称为仿函数

    std::cout << "The sum is: " << MyAdd()(100, 100) << std::endl; // MyAdd()称为匿名对象

    return 0;
}

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

研一寒假C++复习笔记--运算符重载实例 的相关文章

  • 结构体如何存储在内存中?

    我有一个struct iof header在我的代码中 我确定它的宽度是 24 字节 我执行 sizeof iof header 它返回 32 字节宽 问题1为什么是 32 字节宽而不是 24 字节宽 问题2包括其成员在内 结构体如何存储在
  • fopen_s 怎么会比 fopen 更安全呢?

    我正在处理遗留代码Windows平台 当我编译代码时VS2013 它给出以下警告 错误 C4996 fopen 该函数或变量可能不安全 考虑使用fopen s反而 要禁用弃用 请使用 CRT SECURE NO WARNINGS 详情请参见
  • Caliburn.Micro - ShowDialog() 如何关闭对话框?

    EDIT 新信息 刚刚设法让记录器工作 老实说 我不知道 cm 有一个 并且在尝试使用时收到此消息TryClose TryClose requires a parent IConductor or a view with a Close m
  • 如何在特定时间以毫秒精度触发 C# 函数?

    我有两台计算机 它们的时间通过 NTP 同步 确保时间仅相差几毫秒 其中一台计算机将通过 TCP 向另一台计算机发送一条消息 以在两台计算机上的未来指定时间启动某个 c 函数 我的问题是 如何在特定时间以毫秒精度 或更好 触发 C 中的函数
  • 使用 Json.NET 序列化子类

    我正在尝试使用 Json NET 序列化子类 生成的 json 包含超类的序列化属性 但是not子类对象的属性 这似乎与我发现的一个问题有关这里就这样 https stackoverflow com q 5863496 498969 但必须
  • ASP.NET Web 应用程序中的身份验证遇到问题

    我正在尝试对从登录页面登录我的 Web 应用程序的用户进行身份验证 我正在使用本教程 http support microsoft com kb 301240作为指南 它几乎准确地解释了我希望做什么 但是当我输入用户名和密码时 验证不起作用
  • 自动映射器多对多 stackoverflowException

    我遇到以下映射的堆栈溢出 Mapper CreateMap
  • 使用 C# 将多个音频样本混合到单个文件中

    Closed 此问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我正在寻找一个能够创建音频文件 mp3 或 wav 的库 NAudio http www codeple
  • 在没有 epsilon 的情况下可以将浮点数与 0.0 进行比较吗?

    我知道 要比较两个浮点值 需要使用一些 epsilon 精度 因为它们并不精确 但是 我想知道是否存在边缘情况 我不需要那个 epsilon 特别是 我想知道这样做是否总是安全的 double foo double x if x lt 0
  • 如何从 Qt 应用程序通过 ODBC 连接到 MySQL 数据库?

    我有一个新安装的 MySQL 服务器 它监听 localhost 3306 从 Qt 应用程序连接到它的正确方法是什么 原来我需要将MySQL添加到ODBC数据源 我在遵循这个视频教程后做到了这一点 https youtu be K3GZi
  • 嵌入资源文件的路径

    我的资源文件中有一个图标 我想引用它 这是需要图标文件路径的代码 IWshRuntimeLibrary IWshShortcut MyShortcut MyShortcut IWshRuntimeLibrary IWshShortcut W
  • ASP.NET - 在 RenderContent 调用中将事件处理程序添加到 Repeater 内的 LinkBut​​ton

    我有一个加载自定义用户控件的 Sharepoint WebPart 用户控件包含一个 Repeater 而 Repeater 又包含多个 LinkBut ton 在 Web 部件的 RenderContent 调用中 我有一些用于添加事件处
  • 如何在C中同时运行两个子进程?

    所以我开始学习并发编程 但由于某种原因我什至无法掌握基础知识 我有一个名为 fork c 的文件 其中包含一个 main 方法 在此方法中 我将 main 分叉两次 分别进入子进程 1 和 2 在孩子 1 中 我打印了字符 A 50 次 在
  • ContentDialog 未与 UWP 中心对齐

    据我所知 ContentDialog的默认行为应该是使其在 PC 上居中并在移动设备上与顶部对齐 但就我而言 即使在 PC 上我也将其与顶部对齐 但我不明白发生了什么 我正在使用代码隐藏来创建它 这是我正在使用的代码片段 Creates t
  • 控制台应用程序中使用 Unicode 字符的 _tprintf

    我正在从 Unicode 构建的控制台应用程序 使用 C 和 Visual Studio 2008 执行这个简单的输出 此代码旨在在 Windows 上运行 tprintf L Some sample string n 一切正常 但是如果我
  • 传递数组时在 C 中的函数参数中强制指定数组大小

    Context 在 C 中 我有一个以数组作为参数的函数 该参数用作该函数的输出 输出的大小始终相同 我会 让阅读代码的人清楚所需的大小 不过它已经在函数注释中了 理想情况下 编译会输出警告或错误 这样我就可以在编译时而不是运行时防止出现问
  • 如何将System.Windows dll添加到Visual Studio 2010 Express?

    我正在开发一个小型应用程序C and VS2010 as IDE with NET框架4 我想用CaptureSource类以便从笔记本电脑的网络摄像头捕获视频 为此我需要添加一个命名空间System Windows DependencyO
  • Xcode 7 调试器不会中断内联标头函数

    过去五年我一直在各种 C 项目中使用 Xcode 没有出现这个问题 今天 我打开了一个较旧的项目 大约 2 年前 并尝试通过在该函数中放置一个活动断点来调试头文件中的内联函数 由于某种原因 调试器不会中断此代码 但是 如果我在调用该函数的
  • 当我的进程被终止时到底会发生什么?

    我有一个包含本机代码和托管代码的混合进程 在 Windows Server 2003 上运行 当我从进程资源管理器中终止进程时 它会进入 100 cpu 的状态 并在消失之前保持这种状态一段时间 有时甚至 10 分钟 在此期间我无法 杀死
  • 实体框架代码首次日期字段创建

    我正在使用实体框架代码优先方法来创建我的数据库表 下面的代码 创建一个DATETIME数据库中的列 但我想创建一个DATE柱子 DataType DataType Date DisplayFormatAttribute ApplyForma

随机推荐

  • 【Linux】之 命令大全

    目录 一 帮助指令 二 目录操作指令 三 日期时间类 四 用户权限管理 root 五 文件属性 六 文件搜索类 七 压缩解压命令 八 磁盘查看和分区类 九 进程管理 十 系统定时任务 crontab 服务管理 十一 软件包管理 下载软件 十
  • 神经网络学习小记录51——Keras搭建孪生神经网络(Siamese network)比较图片相似性

    神经网络学习小记录51 Keras搭建孪生神经网络 Siamese network 比较图片相似性 学习前言 什么是孪生神经网络 代码下载 孪生神经网络的实现思路 一 预测部分 1 主干网络介绍 2 比较网络 二 训练部分 1 数据集的格式
  • ubuntu 16.04 修改MAC地址何IP地址

    永久修改MAC地址 方法一 1 编辑 etc init d rc local 文件 sudo gedit etc init d rc local 2 在此配置文件的最后面加上如 Ubuntu 修改网卡的MAC地址 的修改命令 注 16 04
  • 实验:基本的系统安全控制 实验环境 某公司新增了一台企业级服务器,已安装运行RHEL 6操作系统,由系统运维部、软件开发部、技术服务部共同使用。由于用户数量众多,且使用时间不固定,要求针对账号和

    实验 基本的系统安全控制 实验环境 某公司新增了一台企业级服务器 已安装运行RHEL 6操作系统 由系统运维部 软件开发部 技术服务部共同使用 由于用户数量众多 且使用时间不固定 要求针对账号和登录过程采取基本的安全措施 需求描述 允许用户
  • Android解决EditeText内容右对齐时光标位于hint之前的问题

    当EditText的gravity设置为end或者right时 在某些手机上输入框的光标位置会显示在hint文字之前 如下图 如果我们想光标的位置在hint文字后面 即最右边 解决的方法有 方法一 比较省事的做法 设置EditText的te
  • thinkphp5 访问不了多模块

    thinkphp5 访问不了多模块 只能访问默认模块 可能是nginx文件配置问题 更改nginx conf文件 在server段内添加如下代码段 location try files uri uri args if e request f
  • python火灾检测

    火灾检测是一项用于实时火灾探测和自定义图像的人工智能项目 这是火检测的第一个版本 它包含42幅测试图像的数据集 用于训练100幅图像 安装 如果您有一个NVIDIA GPU 那么您可以安装tensorflow gpu包裹 它会让事情发展得更
  • C# EF Newtonsoft.Json.JsonSerializationException 序列化出现异常

    在对EF EntityFramework 查询的数据序列化出现的问题 问题记录 Newtonsoft Json JsonSerializationException 序列化出现异常 Self referencing loop detecte
  • 二叉树面试题总结(Java)

    本文参考博客 http www jianshu com p 0190985635eb 先上二叉树的数据结构 class TreeNode int val 左孩子 TreeNode left 右孩子 TreeNode right 二叉树的题目
  • java自定义button类控件

    上面是做完后的效果 第一次用java来做自定义继承button类控件 如图看到的其实就只有一个经改写的button控件 style 1 2 3 4 是button内部的几个小label而已 不过中间的滑动效果做得不太好 滑动时有闪烁 还请高
  • 哲理故事300篇 下

    哲理故事300篇 上 http blog csdn net andylin02 archive 2006 08 23 1109314 aspx 哲理故事300篇 中 http blog csdn net andylin02 archive
  • 浅谈类和对象

    一 定义 类 类是一个模板 是抽象的 类可以用于创建对象 类是对具有相同特征和作用的对象的抽象 eg 学生是一个抽象的类 具体实现有小学生 中学生 大学生 对象 任何一个具体的事物或者物体就是一个对象 对象是对类的具体实现 eg 我的电脑
  • lr中需要注意的点--安装后打不开ie需要设置的地方

    前提 Loadrunner11仅支持ie9向下版本 若安装了ie10则需要在查看一安装的更新中卸载 1 设置ie浏览器为默认浏览器 2 计算机 gt 属性 gt 高级系统管理 gt 性能 gt 设置 过程中会提示重启 3 tools gt
  • spring 和springboot 整合rabbitmq

    文章目录 spring springboot整合 rabbitmq 4 1 spring 整合rabbitmq 4 2 springboot 整合rabbitmq spring springboot整合 rabbitmq rabbitmq
  • Java文档注释

    Java文档注释 Doc umentation Comments 注意不要将注解 Annotation 与注释 Comments 混淆 Java的有三种注释 1 单行注释 注释内容 2 多行注释 注释内容 3 文档注释 注释内容 Java文
  • vue z-index层级显示问题

    一个单页面 顶部有fixed的nav 当向上滑动页面时 发现nav里有的组件被下放的组件遮盖 第一时间明白这时需要修改层级设置 将下方的组件z index设为 1 nav的组件z index调高 发现还是有各种遮盖的问题 然后花了点时间找资
  • linux查看某个应用占用多少线程

    以tomcat为例 获取tomcat进程pid ps ef grep tomcat 10090 统计该tomcat进程内的线程个数 ps Lf 10090 wc l 数量就是该tomcat启动了多少线程
  • java异常(机制和捕捉(常见异常类))详解 +练习题

    Java 中的异常处理机制 1 什么是异常 异常 程序在运行过程中产生的不正常情况 程序在运行的时候 发生了一些不被预期的事件 从而没有按照我们编写的代码执行 这就是异常 异常是Java中的错误 但是并不是所有的错误都是异常 比如说 你在定
  • zookeeper的动态扩容

    附属意义的扩容 扩容的新增节点为观察者observer 1 观察者概念 a 在zookeeper引入此新的zookeeper节点类型为observer 是为了帮助处理投票成本随着追随者增加而增加的问题并且进一步完善了zookeeper的可扩
  • 研一寒假C++复习笔记--运算符重载实例

    目录 1 运算符重载 2 加号运算符重载 3 左移运算符重载 lt lt 4 递增运算符重载 5 赋值运算符重载 6 关系运算符重载 7 函数调用运算符重载 1 运算符重载 对已有运算符重新进行定义 赋予其另一种功能 以适应不同的数据类型