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

C++封装

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

头文件
#ifndef SEQLIST_H
#define SEQLIST_H#include <iostream>
#include <cstring>
using namespace std;
using datatype = char;class My_string
{
private:datatype *ptr; //顺序表字符数组int size = 15;     //数组的最大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 empty();      //判空void push_back(datatype value); //尾插void pop_back(); //尾删int listsize();  //求长度datatype & at(int inex);  //获取任意位置元素void clear();//清空char *data();//返回C风格字符串int get_length();//返回当前最大容器void show();         //展示void append(const char *ptr);//扩容
};#endif // SEQLIST_H
源文件
#include "seqlist.h"My_string::My_string():size(15)     //无参构造
{this->ptr = new char[size];this->ptr[0] = '\0';this->len = 0;
}
//有参构造
My_string::My_string(const char* src)
{len = strlen(src)+1;this->ptr = new char[len];strcpy(ptr,src);
}My_string::My_string(int num,char value)
{ptr = new char[num +1];for(int i = 0;i<num;i++){this->ptr[i] = value;}this->len = num;
}
//拷贝构造
My_string::My_string(const My_string &other):ptr(new char[other.size]),size(other.size),len(other.len)
{strcpy(this->ptr,other.ptr);this->size = other.size;this->len = other.len;
}
//拷贝赋值
My_string &My_string::operator = (const My_string &other)
{if(this != &other){delete []ptr;size = other.size;ptr = new char[size + 1];strcpy(ptr,other.ptr);}return *this;
}
//析构函数
My_string::~My_string()
{delete []ptr;
}
char *My_string::data()//返回C风格字符串
{return ptr;
}
//判空
bool My_string::empty()
{return ptr[0] == 0;
}//尾插
void My_string::push_back(datatype value)
{this->ptr[len++] = value;
}//尾删
void My_string::pop_back()
{if(this->empty()){cout<<"表为空无删除对象"<<endl;return;}this->len--;
}
//求长度
int My_string::listsize()
{return this->len;
}
//获取任意位置元素
datatype & My_string::at(int index)
{if(this->empty()){throw std::out_of_range("表为空无对象");}if(index>this->len||index<=0){throw std::out_of_range("位置错误");}return this->ptr[index-1];
}//展示
void My_string::show()
{if(this->empty()){cout<<"表为空无对象"<<endl;return;}cout<<"当前顺序表中的元素是:";cout<<"ptr = "<<ptr<<" ";len = strlen(ptr);cout<<"len = "<<len<<endl;
}
int My_string::get_length()//返回当前最大容器
{return this->size;
}
void My_string::clear()//清空
{delete []ptr;ptr = new char[1];ptr[0] = '\0';len = 0;
}void My_string::append(const char *src)
{int src_len = strlen(src);while(len+src_len >= size){size *= 2;char *new_ptr = new char[size];strcpy(new_ptr,ptr);delete []ptr;ptr = new_ptr;}strcat(ptr,src);len += src_len;
}
主程序
#include "seqlist.h"
int main()
{My_string s1("Hello");//拷贝构造My_string s2 = s1;s2.show();//无参构造My_string s3;//拷贝赋值s3 = s1;s3.show();s3.push_back('a');//C字符风格cout<<s3.data()<<endl;s3.pop_back();s3.append(" world ,good");s3.show();//求实际长度cout<<"s3容器的实际长度 = "<<s3.listsize()<<endl;cout<<"s3容器的最大长度 = "<<s3.get_length()<<endl;cout<<"s3容器2号元素= "<<s3.at(2)<<endl;//clears3.clear();s3.show();return 0;
}
效果图

思维导图 


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

相关文章:

  • FASTLIO2建图学习笔记
  • 容器技术在持续集成与持续交付中的应用
  • Java——异常处理
  • MFC图形函数学习08——绘图函数的重载介绍
  • 浅谈C++之内存管理
  • Spring Boot 的生命周期
  • SpringBoot 整合 apache fileupload 轻松实现文件上传与下载(通用版)
  • 设计模式的六大原则
  • 【HarmonyOS】应用权限原理和封装
  • QT设计中文输入法软键盘DLL给到C#开发步骤
  • 常见框架漏洞
  • JBoss EJBInvokerServlet CVE-2013-4810 反序列化漏洞
  • 线程同步:消费者模型(非常重要的模型)
  • STM32之串口通信
  • 【C++篇】走进C++标准模板库:STL的奥秘与编程效率提升之道
  • Redis:持久化
  • pyqt QGraphicsView 以鼠标为中心进行缩放
  • 2024年9月24日 十二生肖 今日运势
  • 高通Android 12 push framework.jar和service.jar
  • 解决跨域问题的方法
  • WinCC中归档数据片段的时间和尺寸设置
  • 深度学习:卷积神经网络(CNN)基础知识
  • WordPress精选文章如何添加侧边栏和页面?
  • 华为三折叠一拆,苹果脸被打肿了!
  • c++ 类中特殊成员函数
  • 【C++】10道经典面试题带你玩转二叉树