当前位置: 首页 > news >正文

C++(5)

1.运算符重载

头文件

#ifndef MYSTRING_H
#define MYSTRING_H#include <iostream>
#include <cstring>using namespace std;class myString
{
private:char *str;//C风格字符串int size=0;
public:std::string s_str;//转换构造函数myString(const std::string &s);//无参构造myString();//有参构造//string s("hello world")myString(const char *s);//有参构造//string s(5,'A');myString(int n, const char s);//析构函数~ myString();//拷贝构造函数myString(const myString &other);//拷贝赋值函数myString &operator=(const myString &other);//判空函数//返回1表示空,返回0表示非空bool empty();//size函数int str_size();//c_str函数const char* c_str() const;//at函数char &at(int index);//二倍扩容void expand();//+运算符重载const myString operator+(const myString &R) const;//+运算符重载const myString operator+(const char &R);//+=运算符重载myString & operator+=(const myString &R);//&(取地址)运算符重载const myString * operator&() const;//[]运算符重载char & operator[](const int index);//==运算符重载bool operator==(const myString &R);//!=运算符重载bool operator!=(const myString &R);//<运算符重载bool operator<(const myString &R);//>运算符重载bool operator>(const myString &R);//<=运算符重载bool operator<=(const myString &R);//>=运算符重载bool operator>=(const myString &R);//将<<重载函数设为友元friend ostream & operator<<(ostream &L, const myString &R);//将>>重载函数设为友元friend istream & operator<<(istream &L, const myString &R);//将getline重载函数设为友元friend istream & getline(istream &L, myString &R);
};#endif // MYSTRING_H

源文件

#include "mystring.h"//函数定义
//转换构造函数
myString::myString(const std::string &s):s_str(s)
{cout<<"转换构造"<<endl;
}
//无参构造
myString::myString():size(10)
{str = new char[size];memset(str,'\0',10);cout<<"无参构造"<<endl;
}
//有参构造
//string s("hello world")
myString::myString(const char *s):size(strlen(s)+1)
{str = new char[size];strcpy(str,s);cout<<"有参构造"<<endl;
}
//有参构造
//string s(5,'A');
myString::myString(int n, const char s):size(n+1)
{str = new char[size];memset(str,s,n);str[n] = '\0';cout<<"有参构造"<<endl;
}
//析构函数
myString::~ myString()
{delete []str;cout<<"析构成功"<<endl;
}
//拷贝构造函数
myString::myString(const myString &other):size(other.size)
{str = new char[size];memcpy(str,other.str,size);cout<<"拷贝构造完成"<<endl;
}
//判空函数
//返回1表示空,返回0表示非空
bool myString::empty()
{if(size==0||str[0]=='\0'){cout<<"该字符串为空"<<endl;return 1;}cout<<"该字符串非空"<<endl;return 0;
}
//size函数
int myString::str_size()
{cout<<"该字符串长度为"<<size<<endl;return size;
}
//c_str函数
const char* myString::c_str() const
{cout<<"该字符串为"<<str<<endl;return str;
}
//at函数
char &myString::at(int index)
{if(empty()||index<0||index>=size){cout<<"查找失败"<<endl;}cout<<"该字符串下标为"<<index<<"的字符为"<<str[index]<<endl;return str[index];
}
//二倍扩容
void myString::expand()
{if(empty()){cout<<"二倍扩容失败"<<endl;return ;}char *nstr = new char[2*size];memcpy(nstr,str,size);delete []str;str = nstr;size*=2;cout<<"二倍扩容成功"<<endl;
}
//拷贝赋值函数
//=运算符重载
myString & myString::operator=(const myString &other)
{if(&other!=this){delete []str;size = other.size;str = new char[size];strcpy(str,other.str);cout<<"=运算符重载"<<endl;}return *this;
}
//+运算符重载
const myString myString::operator+(const myString &R) const
{myString temp;temp.size = size+R.size-1;temp.str = new char[size];strcpy(temp.str,str);strcat(temp.str,R.str);cout<<"+运算符重载"<<endl;return temp;
}
//+运算符重载
const myString myString::operator+(const char &R)
{if(R=='\0'){cout<<"+运算符重载"<<endl;return *this;}else{str[size-1] = R;size++;str[size] = '\0';cout<<"+运算符重载"<<endl;return *this;}
}
//+=运算符重载
myString & myString::operator+=(const myString &R)
{int n_size = size+R.size-1;char *n_str = new char[n_size];strcpy(n_str,str);strcat(n_str,R.str);delete []str;str = n_str;size = n_size;cout<<"+=运算符重载"<<endl;return *this;
}
//&(取地址)运算符重载
const myString * myString::operator&() const
{cout<<"&运算符重载"<<endl;return this;
}
//[]运算符重载
char & myString::operator[](const int index)
{if(index>=0&&index<size){cout<<"该字符串下标为"<<index<<"的字符为"<<str[index]<<endl;cout<<"[]运算符重载"<<endl;return str[index];}throw out_of_range("索引越界,请更改索引!");
}
//==运算符重载
bool myString::operator==(const myString &R)
{if(strcmp(str,R.str)==0){cout<<"这两个字符串相等"<<endl;cout<<"==运算符重载"<<endl;return 1;}cout<<"这两个字符串不相等"<<endl;cout<<"==运算符重载"<<endl;return 0;
}
//!=运算符重载
bool myString::operator!=(const myString &R)
{if(strcmp(str,R.str)!=0){cout<<"这两个字符串不相等"<<endl;cout<<"==运算符重载"<<endl;return 1;}cout<<"这两个字符串相等"<<endl;cout<<"!=运算符重载"<<endl;return 0;
}
//<运算符重载
bool myString::operator<(const myString &R)
{if(strcmp(str,R.str)<0){cout<<str<<"小于"<<R.str<<endl;cout<<"<运算符重载"<<endl;return 1;}cout<<str<<"不小于"<<R.str<<endl;cout<<"<运算符重载"<<endl;return 0;
}
//>运算符重载
bool myString::operator>(const myString &R)
{if(strcmp(str,R.str)>0){cout<<str<<"大于"<<R.str<<endl;cout<<">运算符重载"<<endl;return 1;}cout<<str<<"不大于"<<R.str<<endl;cout<<">运算符重载"<<endl;return 0;
}
//<=运算符重载
bool myString::operator<=(const myString &R)
{if(strcmp(str,R.str)<=0){cout<<str<<"小于等于"<<R.str<<endl;cout<<"<=运算符重载"<<endl;return 1;}cout<<str<<"大于"<<R.str<<endl;cout<<"<=运算符重载"<<endl;return 0;
}
//>=运算符重载
bool myString::operator>=(const myString &R)
{if(strcmp(str,R.str)>=0){cout<<str<<"大于等于"<<R.str<<endl;cout<<">=运算符重载"<<endl;return 1;}cout<<str<<"小于"<<R.str<<endl;cout<<">=运算符重载"<<endl;return 0;
}
//<<运算符重载
ostream & operator<<(ostream &L, const myString &R)
{L<<R.str<<endl;cout<<"<<运算符重载"<<endl;return L;
}
//>>运算符重载
istream & operator<<(istream &L, const myString &R)
{L>>R.str;cout<<">>运算符重载"<<endl;return L;
}
//getline重载
istream & getline(istream &L, myString &R)
{std::string temp;std::getline(L, temp);R.s_str = temp;cout<<"getline重载"<<endl;return L;
}

主程序

#include "mystring.h"int main()
{myString str1;myString str2("Hello world!");str2[9];myString str3(10,'Z');myString str4 = str2;myString str5("You are a genius.");str4.operator!=(str2);str5.operator>(str3);str2.operator<=(str5);cout<<str5;myString s6;cout<<"请输入字符串:";getline(cin,s6);return 0;
}

2.思维导图

相关文章:

C++(5)

1.运算符重载 头文件 #ifndef MYSTRING_H #define MYSTRING_H#include <iostream> #include <cstring>using namespace std;class myString { private:char *str;//C风格字符串int size0; public:std::string s_str;//转换构造函数myString(const std::string &a…...

【进程与线程】程序和进程在内存中的表现

在计算机系统中&#xff0c;程序和进程是两个密切相关但又有本质区别的概念&#xff0c;尤其在内存中的表现上有显著不同&#xff1a; 在这张图中可以直观地看出程序和进程在内存中的结构区别。 基本定义 程序 程序 是一个 静态实体&#xff0c;表示一组写好的指令和数据的…...

个人主页搭建全流程(Nginx部署+SSL配置+DCDN加速)

前言 最近开始准备秋招&#xff0c;打算做一个个人主页&#xff0c;以便在秋招市场上更有竞争力。 目前&#xff0c;现有的一些搭建主页的博文教程存在以下一些问题&#xff1a; 使用Github Page进行部署&#xff0c;这在国内访问容易受阻使用宝塔面板等框架&#xff0c;功能…...

语音合成的预训练模型

语音合成的预训练模型 与 ASR(语音识别)和音频分类任务相比,语音合成的预训练模型检查点明显较少。在 Hugging Hub 上,可以找到近 300 个适合的检查点。 在这些预训练模型中,重点关注两种在 Huggingface Transformers 库中开箱即用的架构——SpeechT5 和 Massive Multili…...

前端组件开发:组件开发 / 定义配置 / 配置驱动开发 / 爬虫配置 / 组件V2.0 / form表单 / table表单

一、最早的灵感 最早的灵感来自sprider / 网络爬虫 / 爬虫配置&#xff0c;在爬虫爬取网站文章时候&#xff0c;会输入给爬虫一个配置文件&#xff0c;里边的内容是一个json对象。里边包含了所有想要抓取的页面的信息。爬虫通过这个配置就可以抓取目标网站的数据。其实本文要引…...

Swagger生成Api文档的增强解决方案--knife4j

方法一&#xff1a; 使用步骤 1.导入 knife4j 的maven坐标 在pom.xml中添加依赖 <dependency><groupId>com.github.xiaoymin</groupId><artifactId>knife4j-openapi3-jakarta-spring-boot-starter</artifactId><version>4.5.0</ver…...

Node.js - HTTP

1. HTTP请求 HTTP&#xff08;Hypertext Transfer Protocol&#xff0c;超文本传输协议&#xff09;是客户端和服务器之间通信的基础协议。HTTP 请求是由客户端&#xff08;通常是浏览器、手机应用或其他网络工具&#xff09;发送给服务器的消息&#xff0c;用来请求资源或执行…...

LangChain学习笔记2 Prompt 模板

安装 langchain 库 pip install langchain1、概念&#xff1a;提示和提示工程 在大语言模型&#xff08;LLMs&#xff09;时代&#xff0c;通过简单地更改提示中的指令&#xff0c;同一个模型可以执行多种任务。这一特性让 LLMs 在各类应用场景中都显得非常灵活和强大。然而&…...

如何在gitlab cicd中实现每月10号上午执行

在 GitLab CI/CD 中&#xff0c;可以通过设置定时触发器&#xff08;Schedules&#xff09;和脚本中的时间判断逻辑结合&#xff0c;确保任务只在每月 10 号的上午运行。 以下是实现的步骤&#xff1a; 1. 设置定时触发器 GitLab 提供了 Schedules 功能&#xff0c;可以指定每…...

SimpleFOC |SimpleFOC学习笔记汇总

在机器人领域&#xff0c;掌握无刷电机的控制相当于掌握机器人设计的“半壁江山”。这个年代&#xff0c;对个人来说学习一种新技术最好是通过开源项目了。通过开源项目快速将项目搭建起来&#xff0c;接着结合实践与理论才能真正掌握技术。 入门FOC&#xff0c;我认为最合适是…...

OpenArk64:Windows 系统分析与逆向工程工具详解

引言 在 Windows 系统的底层操作和逆向工程领域&#xff0c;OpenArk 是一款备受推崇的开源工具集。而 OpenArk64.exe 是 OpenArk 工具的 64 位版本&#xff0c;专门用于 64 位 Windows 系统。它提供了强大的功能&#xff0c;帮助用户深入分析系统内核、进程、文件、注册表等&a…...

数据储存与管理【大数据导论】

这里是阿川的博客&#xff0c;祝您变得更强 ✨ 个人主页&#xff1a;在线OJ的阿川 &#x1f496;文章专栏&#xff1a;大数据入门到进阶 &#x1f30f;代码仓库&#xff1a; 写在开头 现在您看到的是我的结论或想法&#xff0c;但在这背后凝结了大量的思考、经验和讨论 目录 1…...

《从零到一:搭建高效体育直播网站的全流程技术指南》

搭建一个体育直播网站需要综合考虑技术架构、数据来源、用户体验、安全性等多个层面。从整体到细节&#xff0c;搭建这样一个网站的流程比较复杂&#xff0c;但可以分成几个重要的步骤和技术环节。以下是搭建体育直播网站的技术层面准备全流程&#xff1a; 一、需求分析与规划 …...

松散比较(PHP)(小迪网络安全笔记~

免责声明&#xff1a;本文章仅用于交流学习&#xff0c;因文章内容而产生的任何违法&未授权行为&#xff0c;与文章作者无关&#xff01;&#xff01;&#xff01; 附&#xff1a;完整笔记目录~ ps&#xff1a;本人小白&#xff0c;笔记均在个人理解基础上整理&#xff0c;…...

一文了解如何使用 DBeaver 管理 DolphinDB

在日常的数据开发、分析和数据库运维中&#xff0c;一款优秀的 IDE 能够极大地提升工作效率。DBEaver 是一款由 Java 编写的一站式跨平台连接器&#xff0c;其社区版本已能支持连接近百种数据库&#xff0c;受到广大开发者的喜爱。近期。DolphinDB 与 DBeaver 团队共同努力&…...

网络基础知识指南|1-20个

1. IP地址: 即互联网协议地址&#xff0c;是用于标识互联网上的每一个设备或节点的唯一地址。IP地址的作用主要是进行网络设备的定位和路由&#xff0c;确保数据包可以从源设备准确地传送到目标设备。2. 子网掩码: 是用于将一个IP地址划分为网络地址和主机地址的工具。它通常与…...

01.09周四F34-Day50打卡

文章目录 1. -我大衣呢? -就在上次你放的地方。2. 这所学校是在曾经的影院上建立起来的。3. 她今天落到这个地步都怪你。4. 留得青山在,不怕没柴烧。(一息尚存,希望不灭。)5. 有善良的地方就有美德,有美德的地方就有奇迹。(《灰姑娘》原句)6. 为了和老外说话时不再发窘,所…...

Linux简介和环境搭建

Linux 介绍和环境搭建 1、发行版本 Linux 操作系统有多个主流发行版本&#xff0c;每个版本根据不同的目标、特点和使用场景为用户提供了不同的功能和体验。 Ubuntu • 特点&#xff1a;Ubuntu 是最为人熟知的 Linux 发行版之一&#xff0c;强调易用性和用户友好性&#xff…...

在移动端开发图表,uniapp+echarts,需要特殊处理,使用renderjs

1.首先要创建一个组件warning,用来装图表(我排除绿色那段代码为我的需求,不是必要代码) <template> <div class="task_container"> <div class="pop_body"> <div class="footer"> <warning…...

SpringBoot之LazyInitializationBeanFactoryPostProcessor类源码学习

源码分析 /**** author Andy Wilkinson* author Madhura Bhave* author Tyler Van Gorder* author Phillip Webb* since 2.2.0* see LazyInitializationExcludeFilter** 主要用于延迟初始化 Bean 的配置。它通过修改 BeanFactory 的配置来确保某些 Bean 在实际需要时才进行初始…...

oracle与MySQL数据库之间数据同步的技术要点

Oracle与MySQL数据库之间的数据同步是一个涉及多个技术要点的复杂任务。由于Oracle和MySQL的架构差异&#xff0c;它们的数据同步要求既要保持数据的准确性和一致性&#xff0c;又要处理好性能问题。以下是一些主要的技术要点&#xff1a; 数据结构差异 数据类型差异&#xff…...

SpringBoot+uniapp 的 Champion 俱乐部微信小程序设计与实现,论文初版实现

摘要 本论文旨在设计并实现基于 SpringBoot 和 uniapp 的 Champion 俱乐部微信小程序&#xff0c;以满足俱乐部线上活动推广、会员管理、社交互动等需求。通过 SpringBoot 搭建后端服务&#xff0c;提供稳定高效的数据处理与业务逻辑支持&#xff1b;利用 uniapp 实现跨平台前…...

ios苹果系统,js 滑动屏幕、锚定无效

现象&#xff1a;window.addEventListener监听touch无效&#xff0c;划不动屏幕&#xff0c;但是代码逻辑都有执行到。 scrollIntoView也无效。 原因&#xff1a;这是因为 iOS 的触摸事件处理机制和 touch-action: none 的设置有关。ios有太多得交互动作&#xff0c;从而会影响…...

Rapidio门铃消息FIFO溢出机制

关于RapidIO门铃消息FIFO的溢出机制及其与中断抖动的关系&#xff0c;以下是深入解析&#xff1a; 门铃FIFO溢出的本质 在RapidIO系统中&#xff0c;门铃消息FIFO是硬件控制器内部的缓冲区&#xff0c;用于临时存储接收到的门铃消息&#xff08;Doorbell Message&#xff09;。…...

Springboot社区养老保险系统小程序

一、前言 随着我国经济迅速发展&#xff0c;人们对手机的需求越来越大&#xff0c;各种手机软件也都在被广泛应用&#xff0c;但是对于手机进行数据信息管理&#xff0c;对于手机的各种软件也是备受用户的喜爱&#xff0c;社区养老保险系统小程序被用户普遍使用&#xff0c;为方…...

重启Eureka集群中的节点,对已经注册的服务有什么影响

先看答案&#xff0c;如果正确地操作&#xff0c;重启Eureka集群中的节点&#xff0c;对已经注册的服务影响非常小&#xff0c;甚至可以做到无感知。 但如果操作不当&#xff0c;可能会引发短暂的服务发现问题。 下面我们从Eureka的核心工作原理来详细分析这个问题。 Eureka的…...

html css js网页制作成品——HTML+CSS榴莲商城网页设计(4页)附源码

目录 一、&#x1f468;‍&#x1f393;网站题目 二、✍️网站描述 三、&#x1f4da;网站介绍 四、&#x1f310;网站效果 五、&#x1fa93; 代码实现 &#x1f9f1;HTML 六、&#x1f947; 如何让学习不再盲目 七、&#x1f381;更多干货 一、&#x1f468;‍&#x1f…...

【分享】推荐一些办公小工具

1、PDF 在线转换 https://smallpdf.com/cn/pdf-tools 推荐理由&#xff1a;大部分的转换软件需要收费&#xff0c;要么功能不齐全&#xff0c;而开会员又用不了几次浪费钱&#xff0c;借用别人的又不安全。 这个网站它不需要登录或下载安装。而且提供的免费功能就能满足日常…...

ThreadLocal 源码

ThreadLocal 源码 此类提供线程局部变量。这些变量不同于它们的普通对应物&#xff0c;因为每个访问一个线程局部变量的线程&#xff08;通过其 get 或 set 方法&#xff09;都有自己独立初始化的变量副本。ThreadLocal 实例通常是类中的私有静态字段&#xff0c;这些类希望将…...

负载均衡器》》LVS、Nginx、HAproxy 区别

虚拟主机 先4&#xff0c;后7...