<二>自己实现简单的string

我们结合运算符重载知识实现string 类
在自己实现的String类中可以参考C++中string的方法
例如构造,加法,大小比较,长度,[] 等操作.
当前的MyString 类中,暂时不加入迭代器,我们将在下一节中加入迭代器的代码.

#include <iostream>
using namespace std;
class MyString {
public:
	//构造函数
	MyString(const char * pSource = nullptr) {
	if (pSource != nullptr) {
	pString = new char[strlen(pSource) + 1];
	strcpy(pString, pSource);
	}
	else {
	pString = new char[1];
	pString[0] = '\0';
	}
	cout << "MyString构造函数,对象地址="<<this << endl;
	}
	//拷贝构造
	MyString(const MyString & _rValue) {
	pString = new char[strlen(_rValue.pString) + 1];
	strcpy(pString, _rValue.pString);
	cout << "MyString拷贝构造函数" << endl;
	}
	//赋值函数
	MyString & operator=(const MyString & _rValue) {
	if (this == &_rValue) {
	return *this;
	}
	delete[] this->pString;
	this->pString = nullptr;
	
	char * _tpString = new char[strlen(_rValue.pString) + 1];
	strcpy(_tpString, _rValue.pString);
	
	cout << "MyString赋值函数" << endl;
	}
	//可编辑
	char & operator[](int index) {
	int len = strlen(this->pString);
	if (index<0) { return pString[0]; }
	else if (index>len) { return pString[index]; }
	else { return pString[index]; }
	}
	//不可编辑
	const char operator[](int index) const {
	int len = strlen(this->pString);
	if (index<0) { return pString[0]; }
	else if (index>len) { return pString[index]; }
	else { return pString[index]; }
	}
	bool operator>(const MyString & _rValue) const {
	return strcmp(this->pString, _rValue.pString)>0;
	}
	bool operator<(const MyString & _rValue) const {
	return strcmp(this->pString, _rValue.pString)<0;
	}
	bool operator==(const MyString & _rValue) const {
	return strcmp(this->pString, _rValue.pString)==0;
	}
	int length() const {
	return strlen(this->pString);
	}
	~MyString() {
	if (this->pString != nullptr) {
	delete[] this->pString;
	this->pString = nullptr;
	cout << "MyString析构函数" << this << endl;
	}
	}
	const char * c_str() const { return this->pString; }
private:
	char * pString ;
	friend MyString operator+ (const MyString & s1, const MyString &s2) ;
	friend ostream & operator<<(ostream & out, const MyString &s) ;
};
MyString operator+(const MyString & s1, const MyString &s2) {
	
	/*
	 方式1 这段代码有 内存泄漏问题 tp 没有释放掉
	 int newLength = strlen(s1.pString) + strlen(s2.pString) + 1;
	 char *tp = new char[newLength + 1];//重新申请空间
	 strcpy(tp, s1.pString);
	 strcat(tp, s2.pString);
	 MyString s(tp);
	 cout << "operator+ = " << &s << endl;
	 return s;
	*/
	/*
	 方式2 对比方式1 效果更高
	*/
	MyString s;
	int newLength = strlen(s1.pString) + strlen(s2.pString) + 1;
	s.pString = new char[newLength + 1];//重新申请空间
	strcpy(s.pString, s1.pString);
	strcat(s.pString, s2.pString);	
	cout << "operator+ = " << &s << endl;
	return s;
}
ostream & operator<<(ostream & out, const MyString &s) {
	 cout << s.pString << endl;
	return out;
}
void test() {
	MyString s1("12345");
	MyString s2("6789ABC");
	cout << s1 << endl;
	cout << s2 << endl;
	MyString s3 = s1 + s2;
	cout << s3 << endl;
	cout << "s3 = " << &s3 << endl;
	for (int i = 0; i < s3.length(); i++) {
	cout << s3[i] << endl;
	}
	
	cout <<"--------------------" << endl;
	s3[0] = 'W';
	for (int i = 0; i < s3.length(); i++) {
	cout << s3[i] << endl;
	}
	const MyString s4("hello");
	
	for (int i = 0; i < s4.length(); i++) {
	cout << s4[i] << endl;
	}
}
int main() {
	test();
	system("pause");
	return 0;
}
作者:Hello_Bugs原文地址:https://www.cnblogs.com/erichome/p/16913628.html

%s 个评论

要回复文章请先登录注册