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

9.23作业

仿照string类,自己手动实现 My_string

代码如下

MyString.h
#ifndef MYSTRING_H
#define MYSTRING_H
#include <iostream>
#include <cstring>using namespace std;class My_string
{
private:char *ptr;         //指向字符数组的指针int size;           //字符串的最大容量int len;            //字符串当前容量public://无参构造My_string();//有参构造My_string(const char* src);My_string(int num, char value);//拷贝构造My_string(const My_string &other);//拷贝赋值My_string & operator= (const My_string &other);//析构函数~My_string();//判空bool Isvoid();//显示void show();//尾插void push_back(char value);//尾删void pop_back();//at函数实现char &at(int index);//清空函数void clear();//返回C风格字符串char *data();//返回实际长度int get_length();//返回当前最大容量int get_size();//君子函数:二倍扩容bool Add();};
#endif // MYSTRING_H
MyString.cpp
#include "MyString.h"My_string::My_string():size(15)
{this->ptr = new char[size];this->ptr[0] = '\0';            //表示串为空串this->len = 0;cout<<"无参构造"<<endl;
}//有参构造
My_string::My_string(const char* src):size(15) {this->ptr = new char[size];strcpy(ptr, src); // 复制字符串this->len = strlen(src);cout << "一个形参的有参构造" << endl;
}
My_string::My_string(int num, char value):size(15),len(num){if(num>15){cout<<"超出默认长度"<<endl;return;}this->ptr = new char[15];for(int i=0;i<num;i++){this->ptr[i] = value;}cout<<"部分形参的有参构造"<<endl;
}
//拷贝构造
My_string::My_string(const My_string &other):size(other.size),len(other.len){this->ptr = new char[size];strcpy(this->ptr, other.ptr); // 复制字符串cout<<"拷贝构造"<<endl;
}
//拷贝赋值
My_string& My_string::operator= (const My_string &other){if(this != &other){delete[] ptr;this->len =other.len;this->size = other.size;for(int i=0;i<other.len;i++){this->ptr[i] =other.ptr[i];}}cout<<"拷贝赋值"<<endl;return *this;
}
//析构函数
My_string::~My_string(){cout<<this->ptr<<"析构函数"<<endl;delete[] ptr;
}
//判空
bool My_string::Isvoid(){return this->len ==0 ? true:false;
}
//显示
void My_string::show(){for(int i=0;i<this->len;i++){cout<<*(this->ptr+i);}cout<<endl;
}
//尾插
void My_string::push_back(char value){if(this->len < this->size-1){*(this->ptr+len++) = value;}else if(this->Add()){*(this->ptr+len++) = value;}
}
//尾删
void My_string::pop_back(){this->len--;
}
//at函数实现
char& My_string::at(int index){if(index<=this->len-1){return this->ptr[index];}else {cout<<"下标越界"<<endl;exit(EXIT_SUCCESS);}
}
//清空函数
void My_string::clear(){free(this->ptr);this->ptr = new char[this->size];this->ptr[0] = '\0';this->len = 0;
}
//返回C风格字符串
char* My_string::data(){return this->ptr;
}
//返回实际长度
int My_string::get_length(){return this->len;
}
//返回当前最大容量
int My_string::get_size(){return this->size;
}bool My_string::Add(){if(this->len == this->size-1){char *p = new char[size*2];strcpy(p,this->ptr);free(this->ptr);this->ptr = p;return true;}else return false;
}
main.cpp
#include "MyString.h"int main(){My_string s;cout<<"s:";s.show();My_string s1("hello");cout<<"s1:";s1.show();My_string s2(5,'A');cout<<"s2:";s2.show();My_string s3 = s2;cout<<"s3:";s3.show();s3 = s1;cout<<"s3:";s3.show();if(s3.Isvoid()){cout<<"s3空"<<endl;}else cout<<"s3非空"<<endl;cout<<"尾插:";s3.push_back('a');s3.show();cout<<"尾删:";s3.pop_back();s3.show();cout<<"查看下标4的值:"<<s3.at(4)<<endl;cout<<"清空s3函数"<<endl;s3.clear();cout<<"s3:";s3.show();cout<<"s1的C风格字符串:"<<s1.data()<<endl;cout<<"s1的实际长度:"<<s1.get_length()<<endl;cout<<"s1当前最大容量:"<<s1.get_size()<<endl;
//    cout<<"s3的二倍扩容"<<endl;
//    char c =' ';
//    while(c!='#'){
//        cin>>c;
//        s3.push_back(c);
//    }//s3.show();
}

运行结果

在这里插入图片描述

思维导图

在这里插入图片描述


http://www.mrgr.cn/news/34820.html

相关文章:

  • 网络工程/售后类面试题
  • CentOS一键安装Mosquitto开源消息代理结合内网穿透实现远程连接
  • 浅谈C++之多线程实现
  • 软考高级:企业信息化-数据挖掘中的上卷和下钻、旋转分析
  • tortoies-orm 一对一、一对多和多对多关系实现
  • 设计模式之中介者
  • k8s知识汇编
  • 前端导出excel表格
  • 分布式难题-三座大山NPC
  • 【JAVA-数据结构】初识集合框架
  • vue2和vue3页面加自定义水印(组件化)
  • 828华为云征文 | 华为云Flexusx与OwnCloud的完美融合,打造高效云端办公环境
  • Centos安装helm
  • 玩手机数据集 8201张玩手机的照片,有对应的xml和txt文件,可以用于yolo训练
  • SaaS 软件转型计划
  • 【python】requests 库 源码解读、参数解读
  • 音视频入门基础:FLV专题(3)——FLV header简介
  • <<编码>> 第 17 章 自动操作(2)--自动加法器 示例电路
  • AI学习指南深度学习篇- Adadelta在深度学习中的应用
  • 两款强大的SSL证书自动化工具:Certimate vs Certd