首页 > 编程语言 >C++ ─── string的模拟实现

C++ ─── string的模拟实现

时间:2024-05-27 22:03:09浏览次数:25  
标签:const string C++ char str capacity 模拟 size

        本博客将简单实现来模拟实现string类,最主要是实现string类的构造、拷贝构造、赋值运算符重载以及析构函数。

        下期我们继续讲解完整版string的模拟实现(将不再会是浅拷贝了)

        说明:下述string类没有显式定义其拷贝构造函数赋值运算符重载,此时编译器会合成默认的,当用s1构造s2时,编译器会调用默认的拷贝构造

        最终导致的问题是,s1、s2共用同一块内存空间,在释放时同一块空间被释放多次而引起程序崩溃,这种拷贝方式,称为浅拷贝

头文件string.h

#define _CRT_SECURE_NO_WARNINGS 1
#pragma once
#include<iostream>
#include<assert.h>


namespace bit
{
	class string
	{
	public:

		// 封装:屏蔽了底层实现细节,提供了一种简单通用访问容器的方式
		typedef char* iterator;

		iterator begin();
		iterator end();

		//string();
        //String(const char* str = "\0") 错误示范
        //String(const char* str = nullptr) 错误示范

		string(const char* str = "");//缺省参数
		~string();

		const char*  c_str();
		size_t size()const;
		size_t capacity()const;

		char& operator[](size_t pos);

	private:
		char* _str;
		size_t _size;
		size_t _capacity;
	};
}

string.cpp

#include"string.h"

namespace bit
{

	string::iterator string::begin()
	{
		return _str;
	}
	string::iterator string::end()
	{
		return _str + _size;
	}
	//string::string()
	//{
	//	_str = new char[1] {'\0'};
	//	_size = 0;
	//	_capacity = 0;
	//
	//}
	string::string(const char* str)
		:_size(strlen(str))
	{
		_str = new char[_size + 1];
		_capacity = _size;
		strcpy(_str, str);
	}
	string::~string()
	{
		delete[] _str;
		_str = nullptr;
		_size = 0;
		_capacity = 0;
	}

	const char* string::c_str()
	{
		return _str;
	}
	size_t string::size()const
	{
		return _size;
	}
	size_t string::capacity()const
	{
		return _capacity;
	}

	char& string::operator[](size_t pos)
	{
		assert(pos<_size);
		return _str[pos];
	}
}

测试文件test.cpp

#define _CRT_SECURE_NO_WARNINGS 1
#include"string.h"

void test_string1()
{
	bit::string s1("hello csdn");
	bit::string s2;
	
	std::cout <<std::endl;
}
void test_string2()
{
	bit::string s1("hello csdn");
	s1[0] = 'X';
}
void test_string3()
{
	bit::string s1("hello csdn");
	for (size_t i = 0; i < s1.size(); ++i)
	{
		std::cout << s1[i] << " ";
	}
	std::cout << std::endl;

	bit::string::iterator it1 = s1.begin();
	while (it1 != s1.end())
	{
		std::cout << *it1 << " ";
		++it1;
	}
	std::cout << std::endl;

	for (auto& e : s1)
	{
		e++;
		std::cout << e << " ";
	}
	std::cout << std::endl;

	bit::string s2;
	std::cout << s1.c_str()<<std::endl;
	std::cout << s2.c_str();
	
}
int main()
{
	test_string3();
	return 0;
}

这个博客如果对你有帮助,给博主一个免费的点赞就是最大的帮助❤

欢迎各位点赞,收藏和关注哦❤

如果有疑问或有不同见解,欢迎在评论区留言哦❤

后续我会一直分享双一流211西北大学软件(C,数据结构,C++,Linux,MySQL)的学习干货以及重要代码的分享

标签:const,string,C++,char,str,capacity,模拟,size
From: https://blog.csdn.net/m0_73751295/article/details/139248620

相关文章

  • A Simple Problem with Integers(C++)
     【题目描述】这是一道模板题。给定数列 a[1],a[2],…,a[n] ,你需要依次进行q 个操作,操作有两类:C、lrx :给定 l,r,x ,对于所有 i∈[l,r] ,将 a[i] 加上 x (换言之,将 a[l],a[l+1],…,a[r] 分别加上 x );Q、lr :给定l,r ,求 ∑ri=la[i] 的值(换言之,求 a[l]+a[l+......
  • 赛克oj 1540 开心消消乐(并查集、模拟、回溯)
    赛氪OJ-专注于算法竞赛的在线评测系统(saikr.com)题目描述近来,小明的班上风靡着一款名为“开心消消乐”的游戏,为了成为大家眼中的超人,小明开始疯狂研究这款游戏的玩法。游戏的场景是一个......
  • Object 和 String
    APIAPI--ApplicationProgrammingInterface应用程序接口1Object常用方法publicstaticvoidmain(String[]args)throwsCloneNotSupportedException{//Object是java中所有类的顶级父类TestDemotestDemo=newTestDemo();//println中......
  • c++设计模式-装饰器模式和代理模式
    namespace_nmsp1{//抽象的控件类classControl{public:virtualvoiddraw()=0;//draw方法,用于将自身绘制到屏幕上。public:virtual~Control(){}//做父类时析构函数应该为虚函数};//列表控件类classListCtrl......
  • MindSponge分子动力学模拟——多路径分子模拟(2024.05)
    技术背景在前面的MindSponge教程系列博客中,我们已经介绍过MindSponge分子动力学模拟框架的基础功能使用方法,例如MindSponge的安装与使用、定义分子系统、计算单点能和迭代器等等。这些模块和功能,更多的是凭借MindSpore深度学习框架的自动微分、GPU加速和Python语言的灵活性,而本文......
  • 通过adb设置雷电模拟器的HTTP代理
    连接雷电模拟器.\adbconnect127.0.0.1:5555获取路由地址,一般为172.16.1.2(这里我的笔记本显示是172.16.1.1,但是未设置成功,那就用172.16.1.2).\adb-s127.0.0.1:5555shell'iproutelisttableallscopeglobal|cut-F3'.\adb-s127.0.0.1:5555shellsettingsputgl......
  • 【C++】旋转字符串——精准与否,就是屠宰和手术的区别
    ✨题目链接:NC114旋转字符串✨题目描述 字符串旋转:给定两字符串A和B,如果能将A从中间某个位置分割为左右两部分字符串(可以为空串),并将左边的字符串移动到右边字符串后面组成新的字符串可以变为字符串B时返回true。例如:如果A=‘youzan’,B=‘zanyou’,A按‘you’‘zan’......
  • C++系列-operator new和operator delete函数
    ......
  • 图像处理之基于标记的分水岭算法(C++)
    图像处理之基于标记的分水岭算法(C++)文章目录图像处理之基于标记的分水岭算法(C++)前言一、基于标记点的分水岭算法应用1.实现步骤:2.代码实现总结前言传统分水岭算法存在过分割的不足,OpenCV提供了一种改进的分水岭算法,使用一系列预定义标记来引导图像分割的定义方式......
  • c++箭头运算符在类与结构体之间可以做的功能简介
    #include<iostream>//箭头运算符在类与结构体之间可以做的功能以及重载运算符。#include<string>classentity{public: intx;public: voidprint()const{std::cout<<"hello!"<<std::endl;}};classscopedPtr{private: entity*m_Obj;public: sc......