当前位置:首页 » 《关于电脑》 » 正文

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

28 人参与  2024年11月11日 13:22  分类 : 《关于电脑》  评论

点击全文阅读


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

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

 

目录

 

一、string类的构造

 二、string类的拷贝构造

三、string类的析构函数

四.基本的函数实现

1.reserve的函数实现

 2.find函数的实现

 3.push_back函数的实现

4.insert函数的实现


一、string类的构造

//为了区分标准库,我们用Stringclass 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://zhangshiyu.com/post/184575.html

<< 上一篇 下一篇 >>

  • 评论(0)
  • 赞助本站

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。

关于我们 | 我要投稿 | 免责申明

Copyright © 2020-2022 ZhangShiYu.com Rights Reserved.豫ICP备2022013469号-1