9.23作业

server/2024/10/4 7:59:25/

仿照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), len(0) {ptr = new char[size];ptr[0] = '\0'; // 表示串为空串cout << "无参构造" << endl;
}My_string::My_string(const char* src) : size(15) {ptr = new char[size];strcpy(ptr, src); // 复制字符串len = strlen(src);cout << "一个形参的有参构造" << endl;
}My_string::My_string(int num, char value) : size(15), len(num) {if (num > 15) {cout << "超出默认长度" << endl;return;}ptr = new char[size];for (int i = 0; i < num; i++) {ptr[i] = value;}ptr[num] = '\0'; // 确保字符串以'\0'结尾cout << "部分形参的有参构造" << endl;
}My_string::My_string(const My_string &other) : size(other.size), len(other.len) {ptr = new char[size];strcpy(ptr, other.ptr); // 复制字符串cout << "拷贝构造" << endl;
}My_string& My_string::operator= (const My_string &other) {if (this != &other) {delete[] ptr; // 释放旧内存size = other.size;len = other.len;ptr = new char[size];strcpy(ptr, other.ptr); // 复制字符串}cout << "拷贝赋值" << endl;return *this;
}My_string::~My_string() {cout << ptr << "析构函数" << endl;delete[] ptr;
}bool My_string::Isvoid() {return len == 0;
}void My_string::show() {cout << ptr << endl;
}void My_string::push_back(char value) {if (len < size - 1) {ptr[len++] = value;ptr[len] = '\0'; // 确保字符串以'\0'结尾} else if (Add()) {ptr[len++] = value;ptr[len] = '\0'; // 确保字符串以'\0'结尾}
}void My_string::pop_back() {if (len > 0) {len--;ptr[len] = '\0'; // 确保字符串以'\0'结尾}
}char& My_string::at(int index) {if (index < len) {return ptr[index];} else {cout << "下标越界" << endl;exit(EXIT_FAILURE);}
}void My_string::clear() {len = 0;ptr[0] = '\0'; // 确保字符串以'\0'结尾
}char* My_string::data() {return ptr;
}int My_string::get_length() {return len;
}int My_string::get_size() {return size;
}bool My_string::Add() {if (len == size - 1) {char *p = new char[size * 2];strcpy(p, ptr);delete[] ptr; // 释放旧内存ptr = p;size *= 2; // 更新容量return true;}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的值:";if (s3.get_length() > 4) {cout << s3.at(4) << endl;} else {cout << "下标越界" << 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;cout << "请输入一串字符串:";char c = ' ';while (true) {cin >> c;if (c == '#') break; // 直接在这里判断并退出循环s3.push_back(c);}s3.show();return 0;
}

运行结果

在这里插入图片描述

思维导图

在这里插入图片描述


http://www.ppmy.cn/server/122835.html

相关文章

UML——统一建模语言

序言&#xff1a; 是统一建模语言的简称&#xff0c;它是一种由一整套图表组成的标准化建模语言。UML用于帮助系统开发人员阐明&#xff0c;展示&#xff0c;构建和记录软件系统的产出。UML代表了一系列在大型而复杂系统建模中被证明是成功的做法&#xff0c;是开发面向对象软件…

SpringBoot | Maven快速上手

文章目录 一、Maven1.1 Maven 简介&#xff1a;1.2 Maven 的核心功能&#xff1a;1.2.1 项目构建&#xff1a;1.2.2 依赖管理&#xff1a; 1.3 Maven 仓库&#xff1a;1.3.1 本地仓库&#xff1a;1.3.2 中央仓库&#xff1a;1.3.3 私服&#xff1a; 二、第一个 SpringBoot 程序…

蓝桥杯15届C/C++B组省赛题目

问题描述 小蓝组织了一场算法交流会议&#xff0c;总共有 5050 人参加了本次会议。在会议上&#xff0c;大家进行了握手交流。按照惯例他们每个人都要与除自己以外的其他所有人进行一次握手 (且仅有一次)。但有 77 个人&#xff0c;这 77 人彼此之间没有进行握手 (但这 77 人与…

ScrapeGraphAl AI爬虫

官网&#xff1a;https://scrapegraph-ai.readthedocs.io/en/latest/ from flask import Flask, request, jsonify from scrapegraphai.graphs import SmartScraperGraphapp Flask(__name__)openai_key "sk-xxxxxxxxxxxxxxxxxxxx"graph_config {"llm":…

AI大模型开发智能机票助手源码

智能机票助手&#xff1a;使用 Spring AI Alibaba 构建 在本篇文章中&#xff0c;我们将探讨如何使用 Spring AI Alibaba 框架来构建一个智能机票助手。这个助手将能够帮助用户完成机票预订、解答问题、改签和取消等服务。 项目概述 智能机票助手的目标是利用 AI 技术来提升…

Linux Shell: 使用 Expect 自动化 SCP 和 SSH 连接的 Shell 脚本详解

文章目录 0. 引言2. 解决方案3. 脚本详解脚本1&#xff1a;使用 SSH 和 Expect 自动化登录远端机器脚本说明 脚本2&#xff1a;使用 SCP 和 Expect 自动化文件上传脚本说明 脚本3&#xff1a;使用 SCP 和 Expect 自动化文件下载脚本说明 4. 脚本的使用方法5. 关键技术点5.1. Ex…

JavaEE: 深入探索TCP网络编程的奇妙世界(六)

文章目录 TCP核心机制TCP核心机制九: 面向字节流TCP核心机制十: 异常处理 小小的补充(URG 和 PSH)~TCP小结TCP/UDP 对比用UDP实现可靠传输(经典面试题) 结尾 TCP核心机制 上一篇文章JavaEE: 深入探索TCP网络编程的奇妙世界(五) 书接上文~ TCP核心机制九: 面向字节流 TCP是面…

【数据结构入门】排序算法之三路划分与非比较排序

文章目录 前言 一、三路划分优化 1.1. 基本思想 1.2. 实现步骤 1.3. 优点 1.4 代码实现 二、非比较排序 2.1 计数排序 2.1.1基本思想 2.1.2具体步骤 2.1.3算法特性 2.1.4算法实现 2.2 基数排序 2.2.1基本思想 2.2.2具体步骤 2.2.3 基数排序的方法 2.2.4算法特…