首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

C++【string类,模拟实现string类】

string类的常用接口说明和使用在C++中,std::string 类是标准库的一部分,它提供了一个方便的接口来处理字符串。...)函数名称功能说明string() (重点)构造空的string类对象,即空字符串string(const char* s) (重点)用C-string来构造string类对象string(size_t...string类的模拟实现经典的string类问题上面已经对string类进行了简单的介绍,大家只要能够正常使用即可。...在面试中,面试官总喜欢让 学生自己来模拟实现string类,最主要是实现string类的构造、拷贝构造、赋值运算符重载以及析 构函数。大家看下以下string类的实现是否有问题?​...在 std::string 的情况下,每次你进行拷贝构造或赋值操作时,都会执行深拷贝 stringl类模拟实现【代码】string.h​#define _CRT_SECURE_NO_WARNINGS 1

11610
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    string类(下)(模拟实现string类,深度剖析其底层)

    string类的模拟实现 补充内容:断言 断言(Assertion)是编程中一种常用的调试辅助手段,用于在代码执行期间验证某个条件是否为真。...命名空间 在编写string类之前,应该先设置一个命名空间,防止与std命名空间冲突 建议初学者命名空间都设置为自己的名字缩写,方便使用 namespace xny { class string...构造函数 构造函数在string类的实现中很容易写错,就比如: string() :_size(0) , _capacity(0) , _str(new char[1]) { _str[0] =...这意味着在这个实现中,字符串的初始容量等于其长度,没有预留额外的空间用于未来的增长。然而,这种设计在实际应用中可能不是最高效的,因为每次字符串增长时都可能需要重新分配内存。..._str); swap(tmp); // this->swap(tmp); } 【步骤解释】: 先写一个swap函数实现交换两对象的成员函数。

    9510

    string类的模拟实现

    错误一: 这里使用初始化列表进行构造函数的初始化,str本身是const类型,而初始化列表又将str赋值给了_str,所以此时就无法对str进行接下来string类的增删查改操作(只有查可以)。...综上我们可以看出string的构造不适合用初始化列表,因此我们改用普通构造函数,大不了我们定义的时候不初始化,其实对于string这个类是没有问题的。...二、自定义实现 [ ] 操作符: 注意这里必须要使用引用返回!!!...这里有两种 [ ] 实现方式,第一种就是普通版本(可读可写),第二种就是const版本(只准读)。...this; } 七、流插入和流提取操作符的重载 我们默认都是将这两个函数重载在类的外部,所以不是类的成员函数,因为使用上的方便。

    7110

    string类的模拟实现

    上一篇博客我们对string类函数进行了讲解,今天我们就对string类进行模拟实现,以便于大家更加深入地了解string类函数的应用 由于C++的库里面本身就有一个string类,所以我们为了不让编译器混淆视听...,我们可以首先将我们自己模拟实现的string类放入一个我们自己定义的命名空间内,这里我将命名空间命名为jh(本人名字首字母缩写): namespace jh { class string {...}; } 然后就是我们将string类的类的成员进行定义: string类实际就是字符串,它的几个成员有capacity(容量),size(字符拆串当前字符个数),str(字符串的指针) namespace...类的大部分经常使用的成员函数进行模拟实现: 构造函数 首先定义一个构造函数,用于创建string类,这里大家用到了strlen和strcpy函数,所以要带上头文件string.h 还有一个需要注意的点...string类的外面,但是要放入命名空间jh内 流插入很简单,直接用语法糖 ostream& operatorstring& s) { for (auto

    11110

    stl中String类的实现

    /串连接 String operator+(const String& s)const;//串连接:类串=类串+类串 String operator+(const char* c)const;//串连接...:类串=类串+c串 friend String operator+(const char* c,const String& s);//串连接:类串=c串+类串 //串比较 bool operator...,就加上这行代码,默认其为安全,注意:必须要置顶 #include"string.h" #includestring.h> //1.默认构造函数的实现--同时也是转换构造函数 //注意:如果声明的时候写了默认实参...,那么实现的时候就不能再次写一遍,不然会报错 String::String(const char* c) { size = strlen(c);//strlen不包含\0长度,sizeof包含\0...,而不能出现在友元函数的实现中 String operator+(const char* c, const String& s) { String w; int len = strlen(c) +

    53110

    【C++】string类——模拟实现

    前言 通过模拟实现string类的主要接口可以使我们对string类的理解更加透彻,深入理解内存管理,可以更好地理解字符串在内存中的存储方式,以及如何进行内存分配和释放,从而避免常见的内存泄漏和溢出问题...1、string类主要函数接口 模拟实现string类,主要是实现string类的构造、拷贝构造、运算符重载、析构等。...为了防止与标准库中string类命名冲突,我们在空间域yjz中来模拟实现我们的string类。...& operator>>(istream& in, string& str); } 2、string类的模拟实现 2.1 构造和析构 无参构造和带参构造可以合为一个默认构造,缺省参数不能给nullptr...+= _str[pos + i]; } return sub; } 3、string类模拟实现完整代码 string.h: #pragma once #include #include

    10810

    【C++】string类模拟实现

    前言 在之前的两篇博客中已经分享关于string类的使用,有需要可以点击链接看看【C++】string类初步介绍和链接: 【C++】string进一步介绍,这次要分享用C++代码来实现string类。...构造函数和析构函数 要写string就得先定义string类,它里面的成员变量有: private: char* _str; size_t _size; size_t _capacity;...实现一下简单的交换,直接将将两个字符串内容交换就行,使用库函数里面的swap来实现: void swap(string& s) { std::swap(_str, s....这里的io流在istream类里面: 在istream类有: 所以这里得用get来取字符: 流提取是一个覆盖,在提取之前先清空,就用clear,再用get来获取字符: istream...附string类实现代码 #pragma once #include namespace bit { class string { public: typedef char

    15810

    【c++】string类模拟实现

    1.基本框架 我们stl库中的string类实在std命名空间的,这里我们自定义一个命名空间own,包含string类和简单的成员变量: namespace own { class string {...类有多种构造函数,我们来实现常见的几种: string() 空字符串构建: string() :_str(new char[1]) ,_size(0) ,_capacity(0) { _str...& s) 我们知道,系统默认的拷贝构造是逐个字节的浅拷贝,会导致两个字符串指向同一个空间,在析构时可能会对同一个空间多次释放使系统崩溃 所以,我们需要手动实现深拷贝 string(const string...类对象和const string类对象都可以调用这几个函数 operator[ ] 这个函数功能就是返回[]位置的字符,实现如下: char& operator[](size_t pos) {...这个函数非常有用,模拟实现如下: string substr(size_t pos=0, size_t len=npos) { string sub; if (len == npos || len

    7710

    【C++】模拟实现string类

    目录 一.了解项目功能 二.逐步实现项目功能模块及其逻辑详解 构建成员变量 实现string类默认成员函数 构造函数 析构函数 拷贝构造函数 赋值运算符重载函数 实现string类成员函数 c_str(...Date类不同,string类是一个典型的需要实现深拷贝的类(【C++】详解深浅拷贝的概念及其区别),系统默认生成的浅拷贝不能满足我们的需求,因此我们需要自己手动实现深拷贝: 深拷贝的逻辑不难...实现string类成员函数 c_str()函数 c_str()函数的作用是返回string类c语言形式的字符串,即string类对象中的_str成员,该函数逻辑较为简单,但还有一些细节需要注意...(*this == s); } 实现string类迭代器 C++中,我们也可以使用迭代器来访问string对象的字符,在string中,迭代器的底层是使用指针来实现的,如下,我们使用typedef...string类的完整模拟实现代码,如需使用,请留意命名空间的限制.

    21810

    【C++】—掌握STL string类:string的模拟实现

    这意味着,对于包含指向动态分配内存的指针的类,如果不显式的实现 深拷贝,那么使用编译器默认生成的拷贝构造函数和运算符重载将导致浅拷贝。...深拷贝的实现 在c++中,实现深拷贝通常涉及以下步骤: • 定义拷贝构造函数: 拷贝构造函数是一个特殊的构造函数,它接受一个同类型对象的引用作为参数。...• 实现赋值运算符重载: 与拷贝构造函数类似,复制运算符重载(operator=)也用于处理对象的复制。...类的模拟实现 3.1 string的构造函数 string(const char* str) :_size(strlen(str)) { _capacity = _size; _str = new...//static const size_t npos = -1; 特殊处理,只有const整形成员可以在类里面给缺省值 void earse(size_t pos, size_t len) { assert

    6010

    CC++:string类的模拟实现

    string的文档网站 string类的介绍以及一些常见问题 String是一个管理字符数组的类,要求这个字符数组结尾用 ‘\0’ 标识 涉及的问题如下: 拷贝构造和赋值重载实现 深拷贝...类的模拟实现 (定义在string.h中) 类的整体框架(简单的直接在框架实现了) #include #include //运用C++风格的头文件 #include...& s); //现代写法的赋值运算符重载(深拷贝问题) void swap(string& s); //自己写的swap去调用全局swap完成类成员变量的交换...capacity; //数组的容量(不包括'\0') size_t _size; //有效字符个数 static const size_t npos; //类外定义..._str); //这里调用的是构造函数,而不是拷贝构造,如果调用拷贝构造,会死循环 this->swap(tmp); //具体看下面swap的实现,其实就是将成员函数交换了

    36420

    【C++】string类的模拟实现

    Ⅰ. string类的介绍以及一些常见问题 string的文档网站 string 是一个管理字符数组的类,要求这个字符数组结尾用 \0 标识 模拟实现涉及的问题如下: 拷贝构造和赋值重载实现...如果是 只读函数 ,则要加 const 如果是 只写函数 ,则不能加 const 如果 既是可读又是可写的函数 ,则要重载两个版本的函数,即 const 版本与 非const 版本 Ⅱ. string类的模拟实现...类的整体框架(简单的直接在框架实现了) #include #include // 运用C++风格的头文件 #include using namespace...& s); // 现代写法的赋值运算符重载(深拷贝问题) void swap(string& s); // 自己写的swap去调用全局swap完成类成员变量的交换...写时拷贝 ​ 写时拷贝就是一种拖延症,是在浅拷贝的基础之上增加了【引用计数】的方式来实现的。 ​ 引用计数:用来记录资源使用者的个数。

    5110

    【C++】string类的模拟实现

    { //std::string:标准中未规定需要\0作为字符串结尾。编译器在实现时既可以在结尾加\0,也可以不加。...所以构造出来的tmp和s就拥有一样大小的空间和数据,然后我们再调用string类的swap成员函数,进行被拷贝对象this和tmp对象的交换,这样只需两行代码就能解决拷贝构造的实现,但真的解决了吗?...string类的修改模块儿中的yyds函数,我们也只实现两个最常用的版本,参数分别为字符和字符串的版本。 在已实现push_back和append的情况下,我们直接进行函数复用即可。...这里实现getline的时候,有一点小问题,对于istream类的对象在传参时,不能使用传值拷贝,编译器会自动删除掉istream类的拷贝构造,防止出现浅拷贝等不确定的问题,如果想要进行解决,则需要用引用...在实现内部,我们利用+=来进行string类对象的字符的尾插。

    63620

    String类

    String字符串: String字符串是由一个char数组构成的,由于这个数组是由final修饰的,所以String也叫做不可变字符串。...例如字符串:String  s = ”1234”; 其实就是char[] value={‘1’,’2’,’3’,’4’}; String s=”123”; 和String s1=new String(“...String类有许多的构造器,这些构造器可以把byte数组、char数组等等转换成字符串: ? 代码示例: ? 运行结果 ? charAt方法: 按字符串下标拿出那个下标的字符方法。例如: ?...既然有不可变字符串,那么就有可变的字符串,那就是StringBuffer类,由于StringBuffer是可变字符串,所以适合追加,修改之类的操作,速度比起String是相当的快。...从以下两个类的部分代码对比就可以到StringBuffer的方法都带有synchronized关键字: StringBuilder类的部分代码: ? StringBuffer类的部分代码: ?

    23720

    【C++】string类的模拟实现

    1、string类的模拟实现 1.1 经典的string类问题 前文已经对string类进行了简单的介绍,大家只要能够正常使用即可。...在面试中,面试官总喜欢让 应试者自己来模拟实现string类,最主要是实现string类的构造、拷贝构造、赋值运算符重载以及析 构函数。...1.3 深拷贝 如果一个类中涉及到资源的管理,其拷贝构造函数、赋值运算符重载以及析构函数必须要显式给出,否则由编译器实现,内置类型会进行浅拷贝,程序会出错。一般情况都是按照深拷贝方式提供。...1.5string其他接口 string底层是数组结构,因此实现迭代器结构,我们可以直接封装原生指针实习。...& operator>>(istream& in, string& s); } 因为剩下的接口代码较多,我们封装在string类外。

    5600
    领券