C++ MyString类的实现

目录

功能要求:

功能1.0

功能2.0

代码实现: 

功能1.0:

MyString.h:

MyString.cpp:

 功能2.0:

实现过程中遇到的问题:

MyString.h:

MyString.cpp:

完整版源代码:

MyString.h:

MyString.cpp:

源.cpp:

应用到的一些小技巧:


 

功能要求:

功能1.0

初步实现MyString类(数据属性包括char * list,int length(字符串长度))

1.1. 实现构造函数(通过字符串初始化list)

1.2. 析构函数

1.3. 字符串拼接

1.4. 字符串比较大小(实现strcmp功能)

1.5. 子串查找

1.6. 提取某个位置字符

1.7. 输出。

功能2.0

2.1. 转换构造函数的使用(系统自动调用)

2.2. 给MyString对象数组赋值

2.3. 返回字符串长度

2.4. 重载 = 运算符

2.5. 重载 += 运算符

2.6. 重载 ! 运算符

2.7. 重载 == 运算符

2.8. 重载 < 运算符

2.9. 重载 != 运算符

2.10. 重载 > 运算符

2.11. 重载 <= 运算符

2.12. 重载 >= 运算符

2.13. 重载 [] 运算符

2.14. 重载 () 运算符

2.15. 流输入>>和流输出<<运算符的重载

代码实现: 

功能1.0:

MyString.h:

#pragma once
#ifndef MYTSTRING_H
#define MYTSTRING_H
class MyString
{
private:
	char* List;
	int length;
public:
	MyString(const char* p_list = "");
	MyString& Cont(const MyString&);
	char atIndex(int);
	void MyStrcmp( MyString);
	void find( MyString,int pos=0);
	void print() const;
	~MyString();
};

#endif // !MYTSTRING_H

MyString.cpp:

#include "MyString.h"
#include<iostream>
using namespace std;
MyString::MyString(const char* p_list )
{
	length = 0;
	const char* p = p_list;
	while (*p)
	{
		length++;
		p++;
	}
	List = new char[length + 1];
	p = p_list;
	int i = 0;
	while (*p)
	{
		//*List = *p;
		List[i] = *p;
		i++;
		//List++;
		p++;
	}
	List[length] = '\0';

}
MyString& MyString::Cont(const MyString& a)
{
	int newlength = this->length + a.length;
	char* templist = new char[newlength +1];
	const char* p = List;
	char* r = templist;
	while (*p)
	{
		*r = *p;
		r++;
		p++;
	}
	const char* q = a.List;
	while (*q)
	{
		*r = *q;
		r++;
		q++;
	}
	templist[newlength] = '\0';
	delete[]List;
	List = templist;
	length = newlength;
	//delete[]templist;
	return *this;
}
char MyString::atIndex(int i)
{
	if (i < 0 || i >= length)
		return ' ';
	else
		return List[i];
}
void MyString::MyStrcmp( MyString b)
{
	int flag = 0;
	if (this->length <= b.length)
	{
		for (int i = 0; i < length; i++)
		{
			if (*(List + i) > b.List[i])
			{
				flag = 1;
				break;
			}
			else if (*(List + 1) < b.List[i])
			{
				flag = 2;
				break;
			}
		}
	}
	else 
	{
		flag = 1;
		for (int i = 0; i < b.length; i++)
		{
			if (*(List + i) > b.List[i])
			{
				flag = 1;
				break;
			}
				
			else if (*(List + 1) < b.List[i])
			{
				flag = 2;
				break;
			}
				
		}
	}
	if (flag == 0)
	{
		print();
		cout<< " is equal to ";
		b.print();
		cout << endl;
	}
	else if (flag == 1)
	{
		print();
		cout << " is greater than ";
		b.print();
		cout << endl;
	}
	else if (flag == 2)
	{
		print();
		cout << " is less than ";
		b.print();
		cout << endl;
	}
}
void MyString::find(MyString a, int pos)
{
	int cnt = 0;
	int pos_=pos;
	int num = 0;
	if (a.length > this->length) 
	{
		cout << "Invalid string" << endl;
		return;
	}
	for (int i = pos; i < this->length; i++)
	{
		if (num == 3)
		{
			cnt++;
			num = 0;
			cout << "字串出现的起始位置:" << pos_ << endl;
		}
		if (num == 0)
			pos_ = i;
		if ( *(List + i) == a.List[num])
		{
			num++;
		}
		else
		{
			num = 0;
		}
	}
	cout << "字串出现次数:" << cnt<<endl;
}
void MyString::print() const
{
	for (int i = 0; i < length; i++)
		cout << List[i];
}
MyString::~MyString()
{
	delete[] List;
}

 功能2.0:

实现过程中遇到的问题:

  1. 在类中设置友元后却无法访问类中私有对象,如下图

        watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBAaGFuX2x4Xw==,size_20,color_FFFFFF,t_70,g_se,x_16

   解决方法:

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBAaGFuX2x4Xw==,size_20,color_FFFFFF,t_70,g_se,x_16

 此时可以正常访问私有对象

我在这个博主这里找到了原因

 

2. 之所以要分别设置指针进行拼接,是为了防止templist指向字符串末尾,导致调用后越界

const MyString& MyString::operator+=(const MyString& a)
{
	int newlength = this->length + a.length;
	char* templist = new char[newlength + 1];
	const char* p = List;
	char* r = templist;
	while (*p)
	{
		*r = *p;
		r++;
		p++;
	}
	const char* q = a.List;
	while (*q)
	{
		*r = *q;
		r++;
		q++;
	}
	templist[newlength] = '\0';
	delete[]List;
	List = templist;
	length = newlength;
	//delete[]templist;
	return *this;
}

 3.发现了一个易错点,上面[]重载可能会改变对象的值,所以直接return ‘ ’会报错

但下面代码有const,不会导致对象被更改,所以可以返回‘ ’

char& MyString::operator[](int i)
{
	if (i < 0 || i >= length)
		exit(1);//退出整个程序,返回值为1
	else
		return List[i];
}
char MyString::operator[](int i)const
{
	if (i < 0 || i >= length)
		return ' ';
	else
		return List[i];
}

 

MyString.h:

Private:
    void setString(const char*);
public:
    int getLength()const;
    const MyString& operator=(const MyString&);
    const MyString& operator+=(const MyString&);
    bool operator!()const;
    bool operator==(const MyString&)const;
    bool operator<(const MyString&)const;
    bool operator!=(const MyString&)const;
    bool operator>(const MyString&)const;
    bool operator<=(const MyString&)const;
    bool operator>=(const MyString&)const;
    char& operator[](int);
    char operator[](int)const;
    MyString operator()(int, int = 0)const;
    friend std::ostream &operator<<(std::ostream&, const MyString&);
    friend std::istream &operator>>(std::istream&, MyString&);

MyString.cpp:

void MyString::setString(const char*a)
{
	List = new char[length + 1];
	if (a != 0)
	{
		for (int i = 0; i <= length; i++)
		{
			List[i] = a[i];
		}
	}
	else
		List[0] = '\0';
}
const MyString& MyString::operator=(const MyString& a)
{
	if (this != &a)
	{
		delete[]List;
		length = a.length;
		setString(a.List);
	}
}
const MyString& MyString::operator+=(const MyString& a)
{
	int newlength = this->length + a.length;
	char* templist = new char[newlength + 1];
	const char* p = List;
	char* r = templist;
	while (*p)
	{
		*r = *p;
		r++;
		p++;
	}
	const char* q = a.List;
	while (*q)
	{
		*r = *q;
		r++;
		q++;
	}
	templist[newlength] = '\0';
	delete[]List;
	List = templist;
	length = newlength;
	//delete[]templist;
	return *this;
}

 

完整版源代码:

MyString.h:

#pragma once
#include<iostream>
#ifndef MYTSTRING_H
#define MYTSTRING_H
class MyString
{
	friend std::ostream &operator<<(std::ostream&, const MyString&);
	friend std::istream &operator>>(std::istream&, MyString&);
public:
	MyString(const char* p_list = "");
	MyString& Cont(const MyString&);
	char atIndex(int);
	void MyStrcmp(MyString&);
	void find(MyString&, int pos = 0);
	void print() const;
	~MyString();
	const MyString& operator=(const MyString&);
	const MyString& operator+=(const MyString&);
	bool operator!()const;
	bool operator==(const MyString&)const;
	bool operator<(const MyString&)const;
	bool operator!=(const MyString&)const;
	bool operator>(const MyString&)const;
	bool operator<=(const MyString&)const;
	bool operator>=(const MyString&)const;
	char& operator[](int);
	char operator[](int)const;
	MyString operator()(int, int = 0)const;
	int getLength()const;
	MyString(const MyString&);
private :
	char* List;
	int length;
	void setString(const char*);
};

#endif // !MYTSTRING_H

MyString.cpp:

#include "MyString.h"
#include<iostream>
using namespace std;
MyString::MyString(const char* p_list)
{
	length = 0;
	const char* p = p_list;
	while (*p)
	{
		length++;
		p++;
	}
	List = new char[length + 1];
	p = p_list;
	int i = 0;
	while (*p)
	{
		//*List = *p;
		List[i] = *p;
		i++;
		//List++;
		p++;
	}
	List[length] = '\0';

}
MyString& MyString::Cont(const MyString& a)
{
	int newlength = this->length + a.length;
	char* templist = new char[newlength + 1];
	const char* p = List;
	char* r = templist;
	while (*p)
	{
		*r = *p;
		r++;
		p++;
	}
	const char* q = a.List;
	while (*q)
	{
		*r = *q;
		r++;
		q++;
	}
	templist[newlength] = '\0';
	delete[]List;
	List = templist;
	length = newlength;
	//delete[]templist;
	return *this;
}
char MyString::atIndex(int i)
{
	if (i < 0 || i >= length)
		return ' ';
	else
		return List[i];
}
void MyString::MyStrcmp(MyString& b)
{
	int flag = 0;
	if (this->length <= b.length)
	{
		for (int i = 0; i < length; i++)
		{
			if (*(List + i) > b.List[i])
			{
				flag = 1;
				break;
			}
			else if (*(List + 1) < b.List[i])
			{
				flag = 2;
				break;
			}
		}
	}
	else
	{
		flag = 1;
		for (int i = 0; i < b.length; i++)
		{
			if (*(List + i) > b.List[i])
			{
				flag = 1;
				break;
			}

			else if (*(List + 1) < b.List[i])
			{
				flag = 2;
				break;
			}

		}
	}
	if (flag == 0)
	{
		print();
		cout << " is equal to ";
		b.print();
		cout << endl;
	}
	else if (flag == 1)
	{
		print();
		cout << " is greater than ";
		b.print();
		cout << endl;
	}
	else if (flag == 2)
	{
		print();
		cout << " is less than ";
		b.print();
		cout << endl;
	}
}
void MyString::find(MyString& a, int pos)
{
	int cnt = 0;
	int pos_ = pos;
	int num = 0;
	if (a.length > this->length)
	{
		cout << "Invalid string" << endl;
		return;
	}
	for (int i = pos; i < this->length; i++)
	{
		if (num == 3)
		{
			cnt++;
			num = 0;
			cout << "字串出现的起始位置:" << pos_ << endl;
		}
		if (num == 0)
			pos_ = i;
		if (*(List + i) == a.List[num])
		{
			num++;
		}
		else
		{
			num = 0;
		}
	}
	cout << "字串出现次数:" << cnt << endl;
}
void MyString::print() const
{
	for (int i = 0; i < length; i++)
		cout << List[i];
}
MyString::~MyString()
{
	delete[] List;
}

void MyString::setString(const char*a)
{
	List = new char[length + 1];
	if (a != 0)
	{
		for (int i = 0; i <= length; i++)
		{
			List[i] = a[i];
		}
	}
	else
		List[0] = '\0';
}
const MyString& MyString::operator=(const MyString& a)
{
	if (this != &a)
	{
		delete[]List;
		length = a.length;
		setString(a.List);
	}
	return *this;
}
const MyString& MyString::operator+=(const MyString& a)
{
	int newlength = this->length + a.length;
	char* templist = new char[newlength + 1];
	const char* p = List;
	char* r = templist;
	while (*p)
	{
		*r = *p;
		r++;
		p++;
	}
	const char* q = a.List;
	while (*q)
	{
		*r = *q;
		r++;
		q++;
	}
	templist[newlength] = '\0';
	delete[]List;
	List = templist;
	length = newlength;
	//delete[]templist;
	return *this;
}
bool MyString::operator!()const  
{
	return length == 0;
}
//当字符串为空时,length=0,所以length==0为真,return 1;反之return 0
bool MyString::operator==(const MyString& a)const
{
	if (length == a.length)
	{
		for (int i = 0; i < length; i++)
		{
			if (List[i] != a.List[i])
				return 0;
		}
		return 1;
	}
	return 0;
}
bool MyString::operator<(const MyString& b)const
{
	int flag = 0;
	if (this->length <= b.length)
	{
		for (int i = 0; i < length; i++)
		{
			if (*(List + i) > b.List[i])
			{
				flag = 1;
				break;
			}
			else if (*(List + 1) < b.List[i])
			{
				flag = 2;
				break;
			}
		}
	}
	else
	{
		flag = 1;
		for (int i = 0; i < b.length; i++)
		{
			if (*(List + i) > b.List[i])
			{
				flag = 1;
				break;
			}

			else if (*(List + 1) < b.List[i])
			{
				flag = 2;
				break;
			}

		}
	}
	if (flag == 2)
		return 1;
	return 0;
}
bool MyString::operator!=(const MyString& a)const
{
	return !(*this == a);
}
bool MyString::operator>(const MyString& a)const
{
	return a < *this;
}
bool MyString::operator<=(const MyString& a)const
{
	return !(a < *this);
}
bool MyString::operator>=(const MyString& a)const
{
	return !(*this < a);
}
//重载过==和<后,即可应用;
char& MyString::operator[](int i)
{
	if (i < 0 || i >= length)
		exit(1);//退出整个程序,返回值为1
	else
		return List[i];
}
char MyString::operator[](int i)const
{
	if (i < 0 || i >= length)
		return ' ';
	else
		return List[i];
}
MyString MyString::operator()(int pos, int n)const
{
	if (pos < 0 || pos >= length||n<0)
	{
		cout << "error inpot" << endl;
		return "";
	}
	int len ;
	if (n == 0 || n + pos > length)
		len = length - pos;
	else len = n;
	char* temp = new char[len + 1];
	for (int i = 0; i < len; i++)
	{
		temp[i] = List[pos + i];
	}
	temp[len] = '\0';
	MyString Temp(temp);
	delete[]temp;
	return Temp;
}
int MyString::getLength()const
{
	return length;
}
MyString::MyString(const MyString& a)
{
	length = a.length;
	List= new char[length+1];
	for (int i = 0; i <= length; i++)
		List[i] = a.List[i];
}
ostream& operator<<(ostream& cout, const MyString& a)
{
	cout << a.List;
	return cout;
}
istream& operator>>(istream& cin, MyString& a)
{
	char temp[100];
	cin >> temp;
	a = temp;
	return cin;
}

源.cpp:

#include<iostream>
#include"MyString.h"
using namespace std;
int main()
{
	MyString str1("Hello ");
	MyString str2("World");
	MyString str3;
	cout << boolalpha << "The results of comparing str2 and str1:";
	cout << "\nstr2==str1 yields " << (str2 == str1)
		<< "\nstr2!=str1 yields " << (str2 != str1)
		<< "\nstr2>str1 yields " << (str2 > str1)
		<< "\nstr2<str1 yields " << (str2 < str1)
		<< "\nstr2>=str1 yields " << (str2 >= str1)
		<< "\nstr2<=str1 yields " << (str2 <= str1);
	if (!str3)
	{
		str3 = str1;
		str1 += str2;
		cout << "\n\nstr1+=str2 yields " << str1;
		cout << "\n\nstr1+=\"!!!\"yields " << endl;
		str1 += "!!!";
		cout << "str1=" << str1 << "\n\n";
		cout << "\n\nThe substring of str1 strating at\n"
			<< "location 0 for 6 characters str1(0,6) ,is:\n"
			<< str1(0, 6) << "\n\n";
		cout << "The substring of str1 strating at\n" << str1(8) << "\n\n";
		MyString* str4 = new MyString(str1);
		cout << "\n*str4=" << *str4;
		cout << "\nassigning *str4 to *str4";
		cout << "\n*str4=" << *str4 << endl;
		delete str4;
		str1[0] = 'H';
		str1[7] = 'W';
	}
	return 0;
}

应用到的一些小技巧:

1. 使用了boolalpha将bool解析成为true或者 false。

便于观察运行结果

注意:当使用boolalpha后,以后的bool类型结果都将以true或false形式输出,除非使用noboolalpha取消 boolalpha流的格式标志。

 

  • 6
    点赞
  • 32
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ItsNorth

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值