C++运算符重载

C++的运算符重载:使对象的运算表现得和编译器内置类型一样

1、应用一:自定义复数类:

#include <iostream>
using namespace std;class CComplex {
public:CComplex(int r = 0, int i = 0): mreal(r), mimage(i){}// 指导编译器怎么做CComplex类对象的加法操作CComplex operator+(const CComplex &com) {return CComplex(this->mreal + com.mreal, this->mimage + com.mimage);}CComplex& operator++(){ // ++在前mreal += 1;mimage += 1;return *this;}CComplex operator++(int) { // ++在后//CComplex comp = *this;//mreal += 1;//mimage += 1;//return comp;return CComplex(mreal++, mimage++);}void operator+=(const CComplex &src) {mreal += src.mreal;mimage += src.mimage;}void show() { cout << "real:" << mreal << " image:" << mimage << endl; }
private:int mreal;int mimage;friend CComplex operator+(const CComplex &lhs, const CComplex &rhs); // 友元函数friend ostream &operator<<(ostream &out, const CComplex &src);friend istream &operator>>(istream &in, CComplex &src);
};	CComplex operator+(const CComplex &lhs, const CComplex &rhs) { // 全局函数如何调用内部成员?定义为友元函数return CComplex(lhs.mreal + rhs.mreal, lhs.mimage + rhs.mimage);
}ostream &operator<<(ostream &out, const CComplex &src) {out << "mreal:" << src.mreal << " mimage:" << src.mimage << endl;return out;
}istream &operator>>(istream &in, CComplex &src) {in >> src.mreal >> src.mimage;return in;
}int main() {CComplex comp1(10, 10);CComplex comp2(20, 20);// comp1.operator+(comp2)加法运算符的重载函数CComplex comp3 = comp1 + comp2;comp3.show();CComplex comp4 = comp1 + 20; // comp1.operator+(20) int->CComplex CComplex(int)comp4.show();// 编译器做对象运算的时候,会调用对象的运算符重载函数(优先调用成员方法); // 如果没有成员方法,就在全局作用域找合适的运算符重载函数//                 ::operator+(30, comp1) 全局函数CComplex comp5 = 30 + comp1;comp5.show();comp5 = ++comp1;//++ --单目运算符 operator++()前置++ operator++(int)后置++comp1.show();comp5.show();comp5 = comp1++;comp1.show();comp5.show();comp5 += comp1;//comp5.show(); //对象信息的输出// cout ::operator<<(cout, comp1) void << endl;// ostream& operator<<(ostream &out, const CComplex &src)cout << comp1 << endl;cin >> comp1 >> comp2;cout << comp1 << comp2 << endl;return 0;
}

2、应用二:自定义String类

#include <iostream>
#pragma warning(disable:4996)using namespace std;class String {
public:String(const char *p = nullptr) {if (p != nullptr) {_pstr = new char[strlen(p) + 1];strcpy(_pstr, p);}else {_pstr = new char[1];_pstr[0] = '\0';}}~String() {delete[] _pstr;_pstr = nullptr;}String(const String &str) {_pstr = new char[strlen(str._pstr) + 1];strcpy(_pstr, str._pstr);}String &operator=(const String &str) {if (this == &str) return *this;delete[] _pstr;_pstr = new char[strlen(str._pstr) + 1];strcpy(_pstr, str._pstr);return *this;}bool operator>(const String &str) const {return strcmp(_pstr, str._pstr) > 0;}bool operator<(const String &str) const {return strcmp(_pstr, str._pstr) < 0;}bool operator==(const String &str) const {return strcmp(_pstr, str._pstr) == 0;}int length() const { return strlen(_pstr); }const char *c_str() const { return _pstr; }//char ch=str6[6]; str6[6]='7'char &operator[](int index) { return _pstr[index]; }//char ch=str6[6]; 不允许修改! str6[6]='7'const char &operator[](int index) const { return _pstr[index]; }
private:char *_pstr;friend String operator+(const String &lhs, const String &rhs);friend ostream &operator<<(ostream &out, const String &str);
};String operator+(const String &lhs, const String &rhs) {//char *ptmp = new char[strlen(lhs._pstr) + strlen(rhs._pstr) + 1];//strcpy(ptmp, lhs._pstr);//strcat(ptmp, rhs._pstr);//return String(ptmp); // 内存泄漏:ptmp 未释放//char *ptmp = new char[strlen(lhs._pstr) + strlen(rhs._pstr) + 1];//strcpy(ptmp, lhs._pstr);//strcat(ptmp, rhs._pstr);//String tmp(ptmp); // 效率太低//delete[] ptmp; //return tmp;String result;delete[] result._pstr; // 释放默认构造的空字符串内存result._pstr = new char[strlen(lhs._pstr) + strlen(rhs._pstr) + 1];strcpy(result._pstr, lhs._pstr);strcat(result._pstr, rhs._pstr);return result;
}ostream &operator<<(ostream &out, const String &str) {out << str._pstr;return out;
}int main() {String strl;String str2 = "aaa";String str3 = "bbb";String str4 = str2 + str3;String str5 = str2 + "ccc";String str6 = "ddd" + str2;cout << "str6:" << str6 << endl;if (str5 > str6) {cout << str5 << ">" << str6 << endl;}else {cout << str5 << "<" << str6 << endl;}int len = str6.length();for (int i = 0; i < len; ++i) {cout << str6[i] << " ";}cout << endl;char buf[1024] = {0};strcpy(buf, str6.c_str());cout << "buf:" << buf << endl;return 0;
}

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

GMSL 明星产品之 MAX96724

上一篇文章中&#xff0c;我们介绍了摄像头侧 GMSL 加串器 MAX96717. 今天我们来介绍下 GMSL 解串器明星产品 MAX96724&#xff1a; 可将四路 GMSL™2/1 输入转换为 1 路、2 路或 4 路 MIPI D-PHY 或 C-PHY 输出。该器件支持通过符合 GMSL 通道规范的 50Ω 同轴电缆或 100Ω 屏…

城市道路车辆自行车摩托车公交车检测数据集VOC+YOLO格式5236张5类别

数据集格式&#xff1a;Pascal VOC格式YOLO格式(不包含分割路径的txt文件&#xff0c;仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件) 图片数量(jpg文件个数)&#xff1a;5236 标注数量(xml文件个数)&#xff1a;5236 标注数量(txt文件个数)&#xff1a;5236 …

VSCode插件Live Server

简介&#xff1a;插件Live Server能够实现当我们在VSCode编辑器里修改 HTML、CSS 或者 JavaScript 文件时&#xff0c;它都能自动实时地刷新浏览器页面&#xff0c;让我们实时看到代码变化的效果。再也不用手动刷新浏览器了&#xff0c;节省了大量的开发过程耗时&#xff01; 1…

论文阅读(十):用可分解图模型模拟连锁不平衡

1.论文链接&#xff1a;Modeling Linkage Disequilibrium with Decomposable Graphical Models 摘要&#xff1a; 本章介绍了使用可分解的图形模型&#xff08;DGMs&#xff09;表示遗传数据&#xff0c;或连锁不平衡&#xff08;LD&#xff09;&#xff0c;各种下游应用程序之…

穷举vs暴搜vs深搜vs回溯vs剪枝系列一>单词搜索

题解如下 题目&#xff1a;解析决策树&#xff1a;代码设计&#xff1a; 代码&#xff1a; 题目&#xff1a; 解析 决策树&#xff1a; 代码设计&#xff1a; 代码&#xff1a; class Solution {private boolean[][] visit;//标记使用过的数据int m,n;//行&#xff0c;列char…

智能小区物业管理系统打造高效智能社区服务新生态

内容概要 随着城市化进程的不断加快&#xff0c;智能小区物业管理系统的出现&#xff0c;正逐步改变传统物业管理的模式&#xff0c;为社区带来了崭新的管理理念和服务方式。该系统不仅提升了物业管理效率&#xff0c;还加强了业主与物业之间的互动&#xff0c;为每位居民提供…

高清种子资源获取指南 | ✈️@seedlinkbot

在如今的数字时代&#xff0c;高清影视、音乐、游戏等资源的获取方式不断丰富。对于追求高质量资源的用户而言&#xff0c;一个高效的资源分享平台至关重要。而 ✈️seedlinkbot 正是这样一个便捷的资源获取工具&#xff0c;为用户提供高质量的种子资源索引和下载信息。 1. ✈️…

3 [通用GITHUB投毒免杀工具安装木马攻击活动的详细分析]

前言概述 通过github投毒的攻击事件之前发生过不少&#xff0c;笔者此前也分析过好几例&#xff0c;有些网友也给笔者发过一些相关的攻击样本&#xff0c;大家从网上下载的安全工具或免杀工具一定不要随便在自己机器上运行&#xff0c;很有可能这些工具就自带后门木马&#xf…

沙皮狗为什么禁养?

各位铲屎官们&#xff0c;今天咱们来聊聊一个比较敏感的话题&#xff1a;沙皮狗为什么会被禁养&#xff1f;很多人对沙皮狗情有独钟&#xff0c;但有些地方却明确禁止饲养这种犬种&#xff0c;这背后到底是什么原因呢&#xff1f;别急&#xff0c;今天就来给大家好好揭秘&#…

LeetCode 404.左叶子之和

题目描述 给定二叉树的根节点 root &#xff0c;返回所有左叶子之和。 示例 1&#xff1a; 输入: root [3,9,20,null,null,15,7] 输出: 24 解释: 在这个二叉树中&#xff0c;有两个左叶子&#xff0c;分别是 9 和 15&#xff0c;所以返回 24 示例 2: 输入: root [1] 输…

一种非接触式智能垃圾桶设计(论文+源码+实物)

1系统方案设计 通过对需求展开分析&#xff0c;本设计非接触式智能垃圾桶采用STM32F103单片机作为控制器&#xff0c;通过红外传感器实现垃圾桶的满溢检测&#xff0c;通过三个SG90舵机分别控制可回收、不可回收、其他垃圾桶盖的开关&#xff0c;并通过WiFi通信模块将数据信息传…

vue入门到实战 三

目录 3.1 v-bind 3.1.1 v-bind指令用法 ​编辑3.1.2 使用v-bind绑定class 3.1.3 使用v-bind绑定style 3.2.1 v-if指令 3.2.1 v-if指令 3.2.2 v-show指令 ​3.3 列表渲染指令v-for 3.3.1 基本用法 3.3.2 数组更新 3.3.3 过滤与排序 3.4 事件处理 3.4.1 使用v-on指令…

Maven全解析:从基础到精通的实战指南

概念&#xff1a; Maven 是跨平台的项目管理工具。主要服务基于 Java 平台的构建&#xff0c;依赖管理和项目信息管理项目构建&#xff1a;高度自动化&#xff0c;跨平台&#xff0c;可重用的组件&#xff0c;标准化的流程 依赖管理&#xff1a; 对第三方依赖包的管理&#xf…

【背包问题】二维费用的背包问题

目录 二维费用的背包问题详解 总结&#xff1a; 空间优化&#xff1a; 1. 状态定义 2. 状态转移方程 3. 初始化 4. 遍历顺序 5. 时间复杂度 例题 1&#xff0c;一和零 2&#xff0c;盈利计划 二维费用的背包问题详解 前面讲到的01背包中&#xff0c;对物品的限定条件…

数据库 - Sqlserver - SQLEXPRESS、由Windows认证改为SQL Server Express认证进行连接 (sa登录)

本文讲SqlServer Express版本在登录的时候&#xff0c; 如何由Windows认证&#xff0c;修改为Sql Server Express认证。 目录 1&#xff0c;SqlServer Express的Windows认证 2&#xff0c;修改为混合认证 3&#xff0c;启用sa 用户 4&#xff0c;用sa 用户登录 下面是详细…

GWO优化LSBooST回归预测matlab

灰狼优化算法&#xff08;Grey Wolf Optimizer&#xff0c;简称 GWO&#xff09;&#xff0c;是一种群智能优化算法&#xff0c;由澳大利亚格里菲斯大学的 Mirjalii 等人于 2014 年提出。该算法的设计灵感源自灰狼群体的捕食行为&#xff0c;核心思想是模仿灰狼社会的结构与行为…

C++模板编程——可变参函数模板

目录 1. 可变参函数模板基本介绍 2. 参数包展开——通过递归函数 3. 参数包展开——通过编译期间if语句(constexpr if) 4. 重载 5. 后记 进来看的小伙伴们应该对C中的模板有了一定了解&#xff0c;下面给大家介绍一下可变参函数模板。过于基础的概念将不仔细介绍。 1. 可变…

海外问卷调查之渠道查,企业经营的指南针

海外问卷调查&#xff0c;是企业调研最常用到的方法&#xff0c;有目的、有计划、有系统地收集研究对象的现实状况或历史状况的一种有效手段&#xff0c;是指导企业经营的有效手段。 海外问卷调查充分运用历史法、观察法等方法&#xff0c;同时使用谈话、问卷、个案研究、测试…

【Numpy核心编程攻略:Python数据处理、分析详解与科学计算】2.3 结构化索引:记录数组与字段访问

2.3 结构化索引&#xff1a;记录数组与字段访问 目录/提纲 #mermaid-svg-gEcf7BuFng5Yj4mv {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-gEcf7BuFng5Yj4mv .error-icon{fill:#552222;}#mermaid-svg-gEcf7BuFng5Y…

在GPIO控制器中,配置通用输入,读取IO口电平时,上拉和下拉起到什么作用

上下拉电阻作用 在通用输入的时候&#xff0c;也就是在读某个IO的电平的时候 一定要让IO口先保持一个电平状态&#xff0c;这样才能检测到不同电平状态。 如何保持电平状态&#xff1f; 1. 可以通过芯片内部的上下拉电阻&#xff0c;由于是弱上下拉一般不用 2. 硬件外界一个…