自定义string类


在学习c++过程中,相比起使用char*或者是char[]数组,使用 string 类对字符串进行操作要方便快速很多。string 并不是c++的基本数据类型,它实际上是一个类,那么这个类具体是怎么实现对字符串的操作的呢?如何去自定义一个类去实现string类同样的效果呢?

首先,先列举一些 string 类可以进行的一些操作:
1、创建一个 string 类对象
2、创建一个新的string 类对象,并用字符串初始化赋值
3、给 string 类对象赋值
4、用已有的string 类对象初始化另一个string 类对象
5、将输入的字符赋值给 string 类对象
6、输出 string 类对象
7、访问 string 类对象的某个元素
……
本次只实现以上功能。

以下是代码:

1、 MyString 类的声明
#pragma once
#include<iostream>
using namespace std;
class MyString
{
public:
	MyString();						// 无参构造函数
	MyString(const char*ch);		// 有参构造函数
	MyString(const MyString & ms);	// 拷贝构造函数
	~MyString();					// 析构函数	
	friend ostream & operator << (ostream & os, MyString & ms);// 重载 <<	
	friend istream & operator >> (istream & is, MyString & ms);// 重载 >>
	char & operator [] (int index);			// 重载 []
	MyString & operator = (const char *ch); // 重载 =
	MyString & operator = (MyString & ms);	// 重载赋值运算符
	MyString  operator + (MyString & ms);	// 重载 +
private:
	int len;   // 长度
	char * str;// char类型的指针
};
2、 MyString 类的实现
#include "MyString.h"
// 无参构造函数
MyString::MyString()
{
	this->len = 0;
	this->str = NULL;//NULL 空指针,没地址; "" 空字符串,有地址的
}
// 析构函数
MyString::~MyString()
{
	if (this->str != NULL)// 指针不为空,释放内存
	{
		delete this->str;
		this->str = NULL;
		this->len = 0;
	}
}
// 有参构造函数
MyString::MyString(const char*ch)
{
	if (this->str == NULL)
	{
		this->len = 0;
		this->str = new char[0 + 1];
		strcpy_s(this->str, strlen("") + 1, "");
	}	
	len = strlen(ch);
	this->str = new char[len + 1];
	strcpy_s(this->str, (len + 1), ch);	
}
// 拷贝构造函数  深拷贝
MyString::MyString(const MyString & myString)
{
	len = myString.len;
	this->str = new char[len + 1];
	strcpy_s(this->str, (len + 1), myString.str);
}
// 重载 = 
MyString & MyString::operator = (const char *ch)
{
	if (this->str != NULL)
	{
		delete[] this->str;
		this->str = NULL;
		this->len = 0;
	}
	if (ch != NULL)
	{
		this->len = strlen(ch);
		this->str = new char[len + 1];
		strcpy_s(this->str, (len + 1), ch);
	}
	return  *this;
}
// 重载 <<
ostream & operator << (ostream & os, MyString & myString)
{
	if (myString.str != NULL) { os << myString.str; }
	return os;
}
// 重载 >>
istream & operator >> (istream & is, MyString & myString)
{
	if (myString.str != NULL)
	{
		delete[] myString.str;
		myString.str = NULL;
		myString.len = 0;
	}
	char temp_str[4096] = { 0 };
	is >> temp_str;	// 输入
	myString.len = strlen(temp_str);
	myString.str = new char[myString.len + 1];
	strcpy_s(myString.str, (myString.len + 1), temp_str);
	return is;
}
// 重载[]
char & MyString::operator [] (int index) { return this->str[index]; }
// 重载赋值运算符 
MyString & MyString::operator = (MyString & myString)
{
	if (this == &myString) { return *this; }
	if (this->str != NULL) //清空原有的数据
	{
		delete[] this->str;
		this->str = NULL;
		this->len = 0;
	}
	this->len = myString.len;
	this->str = new char[this->len + 1];//申请分配一块新的内存
	strcpy_s(this->str, (this->len + 1), myString.str);//拷贝
	return *this;
}
// 重载 +
MyString  MyString::operator + (MyString & myString)
{
	MyString temp;
	int length = this->len + myString.len;
	temp.len = length;
	temp.str = new char[length + 1];
	memset(temp.str, 0, len + 1);
	strcat_s(temp.str, length + 1, this->str);
	strcat_s(temp.str, length + 1, myString.str);
	// strcat_s() 第二个参数 长度 一定要大于源字符串的长度 	

	// void * memset(void *s, int ch, size_t n);
	// 将s中当前位置后面的n个字节用 ch 替换并返回 s 。
	return temp;
}

3、 main 方法调用
#include "MyString.h"
void main()
{	
   MyString myStr;	 // 创建一个 string 类对象		
   myStr = "zxcvb"; // 给 string 类对象赋值
   cout << "myStr  : " << myStr << endl; // 输出

   // 创建一个新的string 类对象,并用字符串初始化赋值
   MyString myStr1("asdfg");	
   cout << "myStr1 : " << myStr1 << endl; // 输出

   MyString myStr2 = "qwert"; 
   cout << "myStr2 : " << myStr2 << endl; // 输出

   // 用已有的string 类对象初始化另一个string 类对象
   MyString myStr3 = myStr;
   cout << "myStr3 : " << myStr3 << endl << endl; // 输出

   // 访问 string 类对象的某个元素
   cout << "myStr3 [3]: " << myStr3[3] << endl << endl;// 输出

   // 字符串相加
   cout << "myStr1 + myStr2 = ";
   cout << (myStr1 + myStr2 ) << endl << endl;

   cout << "myStr1 + myStr2 + myStr3 = ";
   cout << (myStr1 + myStr2 + myStr3) << endl << endl;

   // 将输入的字符赋值给 string 类对象
   MyString myStr4;
   cout << "请输入字符:\n>";
   cin >> myStr4;	//输入
   cout << "myStr4 : " << myStr4 << endl; // 输出
}
4、 运行结果

在这里插入图片描述
感谢您的浏览。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值