C++ 自定义string类 重载相关运算符

c++提供的string类

c++提供的string类可以做很多事情,它本质上是也是类,它的很多运算符都是通过重载进行实现的。

今天我们自己来简单来实现MyString类来模拟 string类能做得一些事情。重载+、[]、==、!=、<<、>> 几个运算符。

写法和自定数组类型重载相关运算符差不多,多了一个+ 拼接运算符重载。

代码展示

MyString.h

#pragma once
#ifndef __MY_STRING_H__
#define __MY_STRING_H__
#include <iostream>
using namespace std;

class MyString
{
public:
	MyString();
	MyString(int len);
	MyString(const char* str);
	//拷贝构造函数
	MyString(const MyString &another);

	friend ostream& operator<<(ostream &cout, MyString& myString);
	friend istream& operator >> (istream &cin, MyString& myString);
	MyString& operator=(const MyString& another);
	char& operator[](int index);
	bool operator==(MyString& another);
	bool operator!=(MyString& another);
	MyString operator+(const MyString& myString);
	~MyString();

private:
	int length;//实际字符个数
	char* str;
};
#endif // !__MY_STRING_H__


MyString.cpp

#include "MyString.h"

MyString::MyString()
{
	this->length = 0;
	this->str = NULL;
}

MyString::MyString(int len)
{
	//cout << "构造函数 MyString::MyString(int len)...." << endl;
	this->length = len;
	this->str = new char[len];
	//初始位空串
	memset(this->str, 0, len);
}
MyString::MyString(const char* str)
{
	//cout << "构造函数 MyString::MyString(const char* str)...." << endl;
	if (str == NULL)
	{
		this->length = 0;
		this->str = new char[1];
		strcpy(this->str, "");
		return;
	}
	this->length = strlen(str);
	this->str = new char[this->length + 1];
	strcpy(this->str, str);

}
//初始化时调用
MyString::MyString(const MyString & another)
{
	//cout << "拷贝构造函数 MyString::MyString(const MyString & another)...." << endl;
	this->length = another.length;
	this->str = new char[this->length+1];
	strcpy(this->str, another.str);
}

MyString & MyString::operator=(const MyString & another)
{
	//cout << "赋值运算符 MyString & MyString::operator=(const MyString & another)...." << endl;
	// 防止自身赋值
	if (this == &another)
	{
		return *this;
	}

	// 如果自身原来有空间,先释放
	if (this->str != NULL)
	{
		delete[] this->str;
		this->str = NULL;
		this->length = 0;
	}

	// 新开辟空间进行内容拷贝
	this->length = another.length;
	this->str = new char[this->length + 1];
	strcpy(this->str, another.str);
	return *this;
}

char& MyString::operator[](int index)
{
	return (this->str[index]);
}

bool MyString::operator==(MyString & another)
{
	if (this == &another)
	{
		return true;
	}
	if (this->length != another.length)
	{
		return false;
	}
	if (strcmp(this->str, another.str) != 0)
	{
		return false;
	}
	return true;
}

bool MyString::operator!=(MyString & another)
{
	return !(*this==another);
}

MyString MyString::operator+(const MyString& another)
{
	int len = this->length + another.length + 1;
	MyString str1(len);
	strcat(str1.str, this->str);
	strcat(str1.str, another.str);
	return str1;
}

MyString::~MyString()
{
	//cout << "~MyString()" << endl;
	if (this->str != NULL)
	{
		delete[] this->str;
		this->str = NULL;
		this->length = 0;
	}
}

ostream & operator<<(ostream & cout, MyString & myString)
{
	if(myString.str!=NULL)
		cout << myString.str;
	return cout;
}

istream & operator >> (istream & cin, MyString & myString)
{
	// 如果原来有字符串,将其清空
	if (myString.str != NULL)
	{
		delete[] myString.str;
		myString.str = NULL;
		myString.length = 0;
	}
	//输入长度未知,用临时变量接收,然后进拷贝
	char temp[1024] = { 0 };
	cin >> temp;
	int len = strlen(temp);
	myString.length = len;
	myString.str = new char[len + 1];
	//注意:如果目标空间大于等于源字符串strcpy会复制到\0
	strcpy(myString.str, temp);

	return cin;
}


MyStringMain.cpp

#define _CRT_SECURE_NO_WARNINGS
#include <cstdio>
#include <iostream>
#include "MyString.h"
using namespace std;

int main(int argc, char *argv[])
{
	MyString str1("hello");//构造函数
	MyString str2("world");//构造函数
	//cout << str1 << str2 << endl;
	MyString str3 = str1;//调用拷贝构造函数
	cout << str3 <<endl;
	str3 = str2;// = 调用赋值运算符
	cout << str3 << endl;
	MyString str4 = str1 + str2;
	cout << str4 << endl;
	cout << "请重置str1和str2:";
	cin >> str1 >> str2;
	str4 = str1 + str2;
	cout << str4 << endl;
	MyString aa("aaa");
	MyString bb("aaa");
	cout <<"aa = " << aa<< ",bb = "<< 
		bb <<",aa==bb:" << boolalpha << (aa == bb) <<endl;
	return 0;
}


运行结果


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值