C++学习第十四课:运算符类型与运算符重载

news2024/12/26 10:36:09

在这里插入图片描述

C++学习第十四课:运算符类型与运算符重载

在C++中,运算符重载是一种使得自定义类型(如类对象)能够使用C++内建运算符的能力。运算符重载允许程序员定义运算符对用户定义类型的特殊行为,这增加了程序的可读性和自然表达能力。本课将详细介绍C++中的运算符类型、运算符重载的概念、语法和示例。

1. C++中的运算符类型

C++提供了多种运算符,它们可以按功能分为以下几类:

  • 算术运算符+, -, *, /, %(取余)。
  • 关系运算符>, <, >=, <=, ==, !=
  • 逻辑运算符&&(逻辑与), ||(逻辑或), !(逻辑非)。
  • 位运算符&, |, ^, ~, <<(左移), >>(右移)。
  • 赋值运算符=, +=, -=, *=, /=, %= 等。
  • 其他运算符sizeof, new, delete 等。

2. 运算符重载的概念

运算符重载允许改变运算符对用户定义类型的行为。C++支持以下几种重载方式:

  • 成员函数:将运算符重载为类的成员函数。
  • 友元函数:将运算符重载为类的友元函数。
  • 转换运算符:允许类对象被视为其他类型。

3. 运算符重载的语法

运算符重载可以通过成员函数或友元函数实现。以下是重载加法运算符为友元函数的示例:

class Vector {
public:
    int x, y;

    // 友元函数,重载加法运算符
    friend Vector operator+(const Vector& v1, const Vector& v2);
};

Vector operator+(const Vector& v1, const Vector& v2) {
    return Vector(v1.x + v2.x, v1.y + v2.y);
}

4. 成员函数重载运算符

运算符也可以作为类的成员函数被重载:

class Complex {
public:
    double real, imag;

    // 成员函数重载加法运算符
    Complex operator+(const Complex& rhs) const {
        return Complex(real + rhs.real, imag + rhs.imag);
    }
};

5. 输入输出流运算符重载

重载输入输出流运算符可以方便地读写类对象:

std::ostream& operator<<(std::ostream& os, const Vector& v) {
    os << "(" << v.x << ", " << v.y << ")";
    return os;
}

std::istream& operator>>(std::istream& is, Vector& v) {
    is >> v.x >> v.y;
    return is;
}

6. 关系运算符重载

关系运算符常用于比较类对象:

bool operator<(const Vector& lhs, const Vector& rhs) {
    return (lhs.x == rhs.x) ? lhs.y < rhs.y : lhs.x < rhs.x;
}

7. 赋值运算符重载

赋值运算符允许定义类对象的赋值行为:

class MyClass {
public:
    int value;

    MyClass& operator=(const MyClass& other) {
        if (this != &other) {
            value = other.value;
            // 深拷贝资源(如果有的话)
        }
        return *this;
    }
};

8. 运算符重载与构造函数

构造函数不能被重载,但可以模拟运算符的行为:

class String {
public:
    char* str;

    String(const char* s) {
        str = new char[strlen(s) + 1];
        strcpy(str, s);
    }

    // 模仿赋值运算符的构造函数
    String& operator=(const String& rhs) {
        if (this != &rhs) {
            delete[] str;
            str = new char[strlen(rhs.str) + 1];
            strcpy(str, rhs.str);
        }
        return *this;
    }

    ~String() {
        delete[] str;
    }
};

9. 运算符重载的规则

  • 运算符重载不能改变运算符的语法或优先级。
  • 不能重载所有的运算符,如 ., ::, .*, sizeof 等。
  • 运算符重载应保持其原有的语义。

10. 特殊运算符重载:函数调用运算符 operator()

函数调用运算符允许类对象表现得像函数一样:

class MathFunc {
public:
    // 重载函数调用运算符
    double operator()(double x) const {
        return x * x + 2 * x + 1;
    }
};

11. 特殊运算符重载:下标运算符 operator[]

下标运算符允许使用数组的下标访问类对象:

class Array {
    int* data;
    int size;
public:
    int& operator[](int index) {
        return data[index];
    }

    const int& operator[](int index) const {
        return data[index];
    }
};

12. 运算符重载与类型转换

运算符重载可以用于类型转换:

class Rational {
    int numerator, denominator;
public:
    // 类似于隐式类型转换的运算符重载
    operator double() const {
        return static_cast<double>(numerator) / denominator;
    }
};

结语

通过本课的学习,你了解了C++中运算符重载的概念、语法和示例。运算符重载是C++的一个强大特性,它使得自定义类型能够使用C++内建运算符,提高了程序的表达能力。

正确使用运算符重载可以增加代码的可读性和一致性,但滥用运算符重载会使代码变得难以理解和维护。因此,运算符重载应遵循明确、一致和可预测的原则。

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

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

相关文章

【介绍下Android开发环境的搭建】

&#x1f308;个人主页: 程序员不想敲代码啊 &#x1f3c6;CSDN优质创作者&#xff0c;CSDN实力新星&#xff0c;CSDN博客专家 &#x1f44d;点赞⭐评论⭐收藏 &#x1f91d;希望本文对您有所裨益&#xff0c;如有不足之处&#xff0c;欢迎在评论区提出指正&#xff0c;让我们共…

iOS ------ Method Swizzling (动态方法交换)

一&#xff0c;Method Swizzling 简介 Method&#xff08;方法&#xff09;对应的是objc_method结构体&#xff1b;而objc_method结构体中包含了SEL method_name(方法名&#xff09;&#xff0c;IMP method_imp&#xff08;方法实现&#xff09; // objc_method 结构体 typed…

【GESP】2023年09月图形化一级 -- 小鸡躲球

小鸡躲球 1. 准备工作 (1)删除默认小猫角色。 (2)添加角色Chick和Ball。 (3)删除默认白色背景,添加背景Blue Sky。 2. 功能实现 (1)点击绿旗,小鸡角色站在地面上,初始位置为(X=-140,Y=-120),初始方向为90,旋转方式为任意旋转。在小鸡角色中设置舞台的初始…

办公楼智慧公厕自发电门锁感应器无需电池供电,环保节能!

在当今科技高速发展的时代&#xff0c;办公楼智慧公厕的自发电门锁感应器成以其独特的优势&#xff0c;为办公楼的卫生设施管理带来了全新的变革。这款感应器无需电池供电&#xff0c;真正做到了环保节能&#xff0c;同时在免电池、免维护、信号稳定、门锁升级、把手设计、应用…

编译工具各版本与操作系统版本号兼容性冷知识 : JetBrains IntelliJ IDEA 各个主要版本及其对应的操作系统版本号的兼容情况

编译工具各版本与操作系统版本号兼容性冷知识 &#x1f9e0;: JetBrains IntelliJ IDEA 各个主要版本及其对应的操作系统版本号的兼容情况 文章目录 编译工具各版本与操作系统版本号兼容性冷知识 &#x1f9e0;: JetBrains IntelliJ IDEA 各个主要版本及其对应的操作系统版本号…

深入OceanBase分布式数据库:MySQL 模式下的 SQL 基本操作

码到三十五 &#xff1a; 个人主页 OceanBase与MySQL模式下兼容性序 在当今的大数据时代&#xff0c;数据库技术的选择对于企业的信息化发展至关重要。OceanBase作为一种高性能、高可用的分布式关系数据库&#xff0c;在与MySQL模式的兼容性方面展现出了显著的优势&#xff0c…

qt5-入门-2D绘图-基础

参考&#xff1a; QPainter_w3cschool https://www.w3cschool.cn/learnroadqt/k7zd1j4l.html C GUI Programming with Qt 4, Second Edition 本地环境&#xff1a; win10专业版&#xff0c;64位&#xff0c;Qt 5.12 代码已经测试通过。其他例子日后更新。 目录 基础知识penb…

微信小程序个人中心、我的界面(示例四)

微信小程序个人中心、我的界面&#xff0c;九宫格简单布局&#xff08;示例四&#xff09; 微信小程序个人中心、我的界面&#xff0c;超简洁的九宫格界面布局&#xff0c;代码粘贴即用。更多微信小程序界面示例&#xff0c;请进入我的主页哦&#xff01; 1、js代码 Page({…

gateway全局token过滤器

添加gateway依赖 <dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-gateway</artifactId></dependency>创建一个tokenFilter 实现全局过滤器GlobalFilter,并且实现fitler方法 Value("${…

PDF高效编辑器,支持修改PDF文档并转换格式从PDF文件转换成图片文件,轻松管理你的文档世界!

PDF文件已成为我们工作、学习和生活中不可或缺的一部分。然而&#xff0c;传统的PDF阅读器往往只能满足简单的查看需求&#xff0c;对于需要频繁编辑、修改或转换格式的用户来说&#xff0c;就显得力不从心。现在&#xff0c;我们为您带来一款全新的PDF高效编辑器&#xff0c;让…

Vue 组件单元测试深度探索:细致解析与实战范例大全

Vue.js作为一款广受欢迎的前端框架&#xff0c;以其声明式的数据绑定、组件化开发和灵活的生态系统赢得了广大开发者的心。然而&#xff0c;随着项目规模的增长&#xff0c;确保组件的稳定性和可靠性变得愈发关键。单元测试作为软件质量的守护神&#xff0c;为Vue组件的开发过程…

开源AI智能名片商城小程序:深度解读IMC(IP、MarTech、Content)视角

在数字化浪潮中&#xff0c;私域流量的运营已成为企业不可或缺的增长引擎。而开源AI智能名片商城小程序&#xff0c;则是以一种全新的视角——IMC&#xff08;IP、MarTech、Content&#xff09;&#xff0c;为企业打开私域流量运营的新篇章。今天&#xff0c;我们就来一起深入解…

mac安装软件遇到无法验证开发者的解决方法

现象 无法打开“”&#xff0c;因为无法验证开发者。这种情况说明正在安装的软件里面有的包被系统判定为不安全的。 解决方法 1、点击取消按钮 2、系统设置-隐私与安全性&#xff0c;点击打开按钮

python可视化图表

1.测试数据准备 2011年1月销售数据.txt 2011-01-01,4b34218c-9f37-4e66-b33e-327ecd5fb897,1689,湖南省 2011-01-01,5b6a6417-9a16-4243-9704-255719074bff,2353,河北省 2011-01-01,ae240260-68a9-4e59-b4c9-206be4c08a8d,2565,湖北省 2011-01-02,c833e851-880f-4e05-9de5-b5…

第6篇:创建Nios II工程之控制LED<一>

Q&#xff1a;还记得第1篇吗&#xff1f;设计简单的逻辑电路&#xff0c;控制DE2-115开发板上LED的亮与熄灭&#xff0c;一行Verilog HDL的assign赋值语句即可实现。本期开始创建Nios II工程&#xff0c;用C语言代码控制DE2-115开发板上的LED实现流水灯效果。 A&#xff1a;在…

力扣141.环形链表142.环形链表Ⅱ 附证明

题目链接&#xff1a; 141. 环形链表 - 力扣&#xff08;LeetCode&#xff09; 142. 环形链表 II - 力扣&#xff08;LeetCode&#xff09; 141.环形链表 方法思路&#xff1a;快慢指针 代码: class Solution { public:bool hasCycle(ListNode *head) {if(!head){return fa…

基于uniapp vue3.0 uView 做一个点单页面(包括加入购物车动画和左右联动)

1、实现效果&#xff1a; 下拉有自定义组件&#xff08;商品卡片、进步器、侧边栏等&#xff09;源码 2、左右联动功能 使用scroll-view来做右边的菜单页&#xff0c;title的id动态绑定充当锚点 <scroll-view :scroll-into-view"toView" scroll-with-animation…

vue+element之解决upload组件上传文件失败后仍显示在列表上、自动上传、过滤、findIndex、splice、filter

MENU 前言错误案例(没有用)正确方法结束语 前言 el-upload上传失败后&#xff0c;文件仍显示在列表上。 这个pdf文件上传失败&#xff0c;仍显示在列表&#xff0c;给人错觉是上传成功&#xff0c;所以要把它去掉。 在element中&#xff0c;file-list和v-model:file-list是用于…

Codigger数据篇(中):数据可控性的灵活配置

在数据服务领域中&#xff0c;数据可控性无疑是至关重要的一环。数据可控性不仅关乎数据的安全性和隐私性&#xff0c;更直接影响到数据价值的实现。Codigger&#xff0c;在其数据可控性方面的灵活配置&#xff0c;为用户提供了更加便捷、高效的数据管理体验。 一、自主选择数…

拌合楼管理系统(十八)如何从一个winForm中的事件修改另外一个Form的控件的值

前言&#xff1a; 上篇讲述了如何手工调用海康的车牌识别摄像头进行拍照和识别车牌&#xff0c;我车牌识别的程序在应用的一个窗体&#xff0c;需要去更新另外一个窗体里面的lable中的内容为识别的车牌信息&#xff0c;同时还要写入到另外窗体的datagridview中。 一、实现效果 …