C++初阶学习第七弹——string的模拟实现

ops/2024/10/18 1:58:53/

C++初阶学习第六弹------标准库中的string类_c语言返回string-CSDN博客 

通过上篇我们已经学习到了string类的基本使用,这里我们就试着模拟实现一些,我们主要实现一些常用到的函数。

 

目录

 

一、string类的构造

 二、string类的拷贝构造

三、string类的析构函数

四.基本的函数实现

1.reserve的函数实现

 2.find函数的实现

 3.push_back函数的实现

4.insert函数的实现


一、string类的构造

//为了区分标准库,我们用String
class String
{
public:String(const char* str = ""){if (str == nullptr){assert(false);return;}_str = new char[strlen(str) + 1];strcpy(_str, str);}void String_print(){cout << _str << endl;}
private:char* _str;
};
int main()
{String s1("abc");s1.String_print();return 0;
}

有一个点要注意的是在给默认参数的时候不要给"\0"或者是空格。

 二、string类的拷贝构造

class String
{
public:String(const char* str = ""){if (str == nullptr){assert(false);return;}_str = new char[strlen(str) + 1];strcpy(_str, str);}String(const String& s): _str(new char[strlen(s._str) + 1]){strcpy(_str, s._str);}void String_print(){cout << _str << endl;}
private:char* _str;
};
int main()
{String s1("abc");s1.String_print();String s2(s1);s2.String_print();return 0;
}

三、string类的析构函数

由于string类对象不管以哪个方式创建时,都需要用new来开辟空间,所以string的析构函数写法为:

   ~string()
{if (_str){delete[]_str;_str = nullptr;_size = _capacity = 0;}
}

四.基本的函数实现

1.reserve的函数实现

void string::reserve(size_t n)
{if (n > _capacity){char*ret = new char[n + 1];strcpy(ret, _str);_str = ret;_capacity = n + 1;}
}

 2.find函数的实现

size_t string::find(char ch, size_t pos)
{assert(pos < _size);for (size_t i = pos; pos < _size; i++){if (_str[i] == ch){return i;}}return npos;
}

 3.push_back函数的实现

void string::push_back(char ch)
{if (_size == _capacity){reserve(_capacity == 0 ? 4 : _capacity * 2);}_str[_size] = ch;_size++;_str[_size] = '\0';
}

4.insert函数的实现

void string::insert(size_t pos, char ch)
{assert(pos <= _size);if (_size == _capacity){reserve(_capacity == 0 ? 4 : _capacity * 2);}int end = _size + 1;while (end > pos){_str[end] = _str[end - 1];end--;}_str[end] = ch;_size++;
}


http://www.ppmy.cn/ops/126353.html

相关文章

JDBC增删改查操作的基本步骤

JDBC&#xff08;Java Database Connectivity&#xff09;是一种用于执行数据库操作的Java API。以下是使用JDBC进行增删改查&#xff08;CRUD&#xff09;操作的基本步骤和代码示例。 步骤&#xff1a; 加载数据库驱动&#xff1a;确保JDBC驱动程序类被加载。建立数据库连接…

WPF入门_02依赖属性

1、依赖属性主要有以下三个优点 1)依赖属性加入了属性变化通知、限制、验证等功能。这样可以使我们更方便地实现应用,同时大大减少了代码量 2)节约内存:在WinForm中,每个UI控件的属性都赋予了初始值,这样每个相同的控件在内存中都会保存一份初始值。而WPF依赖属性很好地…

GitHub如何推送文件到仓库?

要将本地项目推送到 GitHub 上&#xff0c;可以按照以下步骤操作&#xff1a; 在 GitHub 上创建一个新的仓库&#xff1a; 登录你的 GitHub 账号。点击页面右上角的 “” 按钮&#xff0c;并选择 “New repository”。填写仓库名称&#xff0c;可以选择是否公开&#xff08;Pub…

可变参数函数、可变参数模板和折叠表达式

可变参数函数 可变参数是在C编程中&#xff0c;允许函数接受不定数量的参数。这种特性可以帮助我们处理多种情况&#xff0c;例如日志记录、数学计算等。 在C中&#xff0c;可变参数通常通过C风格的可变参数函数实现&#xff0c;需要包含<cstdarg>头文件。 对可变参数…

小说漫画系统 fileupload.php 任意文件上传漏洞复现

FOFA搜索语句 "/Public/home/mhjs/jquery.js" 漏洞复现 1.向靶场发送如下数据包 POST /Public/webuploader/0.1.5/server/fileupload.php HTTP/2 Host: xxx.xxx.xx.xx Cookie: PHPSESSID54bc7gac1mgk0l3nm8cv6sek07; uloginid677742617 Cache-Control: max-age0…

阿里 C++面试,算法题没做出来,,,

我本人是非科班学 C 后端和嵌入式的。在我面试的过程中&#xff0c;竟然得到了阿里​ C 研发工程师的面试机会。因为&#xff0c;阿里主要是用 Java 比较多&#xff0c;C 的岗位比较少​&#xff0c;所以感觉这个机会还是挺难得的。 阿里 C 研发工程师面试考了我一道类似于快速…

android——自定义控件(不停变化的textview、开关switch、动画效果的打勾)

一、从开始数字到结束数字&#xff0c;不断变化 import android.animation.TypeEvaluator; import android.animation.ValueAnimator; import android.content.Context; import android.util.AttributeSet; import android.view.animation.AccelerateDecelerateInterpolator;i…

Linux之如何找回 root 密码?

1、启动系统&#xff0c;进入开界面&#xff0c;在界面中按“e"进入编辑界面 2、进入编辑界面&#xff0c;使用键盘上的上下键把光标往下移动&#xff0c;找到以”Linux16“开通内容所在的行数&#xff0c;在行的最后面输入&#xff1a;init/bin/sh 3、输入完成后&…