C++(5)

news/2025/1/16 21:54:59/

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.思维导图


http://www.ppmy.cn/news/1563719.html

相关文章

【数据结构-堆】力扣1834. 单线程 CPU

给你一个二维数组 tasks &#xff0c;用于表示 n​​​​​​ 项从 0 到 n - 1 编号的任务。其中 tasks[i] [enqueueTimei, processingTimei] 意味着第 i​​​​​​​​​​ 项任务将会于 enqueueTimei 时进入任务队列&#xff0c;需要 processingTimei 的时长完成执行。 现…

如何安装cnpm

今天尝试用npm install安装一个项目的依赖&#xff0c;但是无论如何都不能完成&#xff0c;等待时间非常久&#xff0c;所以同事推荐了cnpm&#xff0c;确实非常好用&#xff0c;所以推荐了出来&#xff0c;希望能给大家带来帮助。 cnpm 是中国淘宝团队提供的一个 npm 镜像工具…

《探索鸿蒙Next上开发人工智能游戏应用的技术难点》

在科技飞速发展的当下&#xff0c;鸿蒙Next系统为应用开发带来了新的机遇与挑战&#xff0c;开发一款运行在鸿蒙Next上的人工智能游戏应用更是备受关注。以下是在开发过程中可能会遇到的一些技术难点&#xff1a; 鸿蒙Next系统适配性 多设备协同&#xff1a;鸿蒙Next的一大特色…

使用vue3实现语音交互的前端页面

代码地址&#xff1a;https://github.com/ZZD3627/my-third-vue.git 需求 1.前端实现录音并将音频传到通过http请求将音频传递到后端 2.基于后端识别的语音及后端返回的内容进行语音沟通实现 1.使用MediaRecorder在前端使用录音功能 2.使用SpeechSynthesis实现将后端传来的文…

大数据学习(34)-mapreduce详解

&&大数据学习&& &#x1f525;系列专栏&#xff1a; &#x1f451;哲学语录: 承认自己的无知&#xff0c;乃是开启智慧的大门 &#x1f496;如果觉得博主的文章还不错的话&#xff0c;请点赞&#x1f44d;收藏⭐️留言&#x1f4dd;支持一下博主哦&#x1f91…

Git | git reset命令详解

关注&#xff1a;CodingTechWork 引言 Git 是一款非常流行的分布式版本控制工具&#xff0c;它帮助开发者有效地管理代码历史&#xff0c;支持多种功能来帮助团队协作、追踪修改和维护代码质量。git reset是 Git 中最强大、最复杂的命令之一&#xff0c;它的主要作用是重置当前…

node.js中实现token的生成与验证

Token&#xff08;令牌&#xff09;是一种用于在客户端和服务器之间安全传输信息的加密字符串。在Web开发中&#xff0c;Token常用于身份验证和授权&#xff0c;确保用户能够安全地访问受保护的资源。 作用与意义 身份验证&#xff1a;Token可以用来验证用户的身份&#xff0…

六种主流虚拟化技术全解析:OpenStack、KVM、Hyper-V、VMware、Xen及Docker

秒懂虚拟化&#xff08;一&#xff09;&#xff1a;从概念到网络、存储虚拟化全解析&#xff0c;通俗解读版-CSDN博客 秒懂虚拟化&#xff08;二&#xff09;&#xff1a;服务器虚拟化、操作系统虚拟化、服务虚拟化全解析&#xff0c;通俗解读版_hostos和guestos-CSDN博客 秒…