当前位置: 首页 > 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 在实际需要时才进行初始…...

ESP32读取DHT11温湿度数据

芯片&#xff1a;ESP32 环境&#xff1a;Arduino 一、安装DHT11传感器库 红框的库&#xff0c;别安装错了 二、代码 注意&#xff0c;DATA口要连接在D15上 #include "DHT.h" // 包含DHT库#define DHTPIN 15 // 定义DHT11数据引脚连接到ESP32的GPIO15 #define D…...

Nginx server_name 配置说明

Nginx 是一个高性能的反向代理和负载均衡服务器&#xff0c;其核心配置之一是 server 块中的 server_name 指令。server_name 决定了 Nginx 如何根据客户端请求的 Host 头匹配对应的虚拟主机&#xff08;Virtual Host&#xff09;。 1. 简介 Nginx 使用 server_name 指令来确定…...

2025 后端自学UNIAPP【项目实战:旅游项目】6、我的收藏页面

代码框架视图 1、先添加一个获取收藏景点的列表请求 【在文件my_api.js文件中添加】 // 引入公共的请求封装 import http from ./my_http.js// 登录接口&#xff08;适配服务端返回 Token&#xff09; export const login async (code, avatar) > {const res await http…...

大模型多显卡多服务器并行计算方法与实践指南

一、分布式训练概述 大规模语言模型的训练通常需要分布式计算技术,以解决单机资源不足的问题。分布式训练主要分为两种模式: 数据并行:将数据分片到不同设备,每个设备拥有完整的模型副本 模型并行:将模型分割到不同设备,每个设备处理部分模型计算 现代大模型训练通常结合…...

用docker来安装部署freeswitch记录

今天刚才测试一个callcenter的项目&#xff0c;所以尝试安装freeswitch 1、使用轩辕镜像 - 中国开发者首选的专业 Docker 镜像加速服务平台 编辑下面/etc/docker/daemon.json文件为 {"registry-mirrors": ["https://docker.xuanyuan.me"] }同时可以进入轩…...

深入浅出深度学习基础:从感知机到全连接神经网络的核心原理与应用

文章目录 前言一、感知机 (Perceptron)1.1 基础介绍1.1.1 感知机是什么&#xff1f;1.1.2 感知机的工作原理 1.2 感知机的简单应用&#xff1a;基本逻辑门1.2.1 逻辑与 (Logic AND)1.2.2 逻辑或 (Logic OR)1.2.3 逻辑与非 (Logic NAND) 1.3 感知机的实现1.3.1 简单实现 (基于阈…...

TSN交换机正在重构工业网络,PROFINET和EtherCAT会被取代吗?

在工业自动化持续演进的今天&#xff0c;通信网络的角色正变得愈发关键。 2025年6月6日&#xff0c;为期三天的华南国际工业博览会在深圳国际会展中心&#xff08;宝安&#xff09;圆满落幕。作为国内工业通信领域的技术型企业&#xff0c;光路科技&#xff08;Fiberroad&…...

向量几何的二元性:叉乘模长与内积投影的深层联系

在数学与物理的空间世界中&#xff0c;向量运算构成了理解几何结构的基石。叉乘&#xff08;外积&#xff09;与点积&#xff08;内积&#xff09;作为向量代数的两大支柱&#xff0c;表面上呈现出截然不同的几何意义与代数形式&#xff0c;却在深层次上揭示了向量间相互作用的…...

python打卡day49@浙大疏锦行

知识点回顾&#xff1a; 通道注意力模块复习空间注意力模块CBAM的定义 作业&#xff1a;尝试对今天的模型检查参数数目&#xff0c;并用tensorboard查看训练过程 一、通道注意力模块复习 & CBAM实现 import torch import torch.nn as nnclass CBAM(nn.Module):def __init__…...

OPENCV图形计算面积、弧长API讲解(1)

一.OPENCV图形面积、弧长计算的API介绍 之前我们已经把图形轮廓的检测、画框等功能讲解了一遍。那今天我们主要结合轮廓检测的API去计算图形的面积&#xff0c;这些面积可以是矩形、圆形等等。图形面积计算和弧长计算常用于车辆识别、桥梁识别等重要功能&#xff0c;常用的API…...