近期,通过C++的学习,了解到了string类,C++相对于C而言放弃使用char*的字符串而选用C++标准程序库中的string类,是因为他和前者比较起来,不必担心内存是否足够、字符串长度等等,而且作为一个泛型类出现,他集成的操作函数足以完成我们大多数情况下的需要。我们可以用 = 进行赋值操作,== 进行比较,+ 做串联。我们尽可以把它看成是C++的基本数据类型。因此,接下来我将完成一个string类的实现。
using namespace std;
#include <iostream>
#include <cstring>
//定义一个MyString类
class MyString {
public:
MyString();
MyString(const char *const);
MyString(const MyString &);
~MyString();
int length()const; //const函数不能修改其数据成员,仅仅起到输出数据的作用
int size() const; //和length功能一致
const char * getString() const; //直接调用字符串首指针返回
friend ostream & operator << (ostream &, const MyString &); //友元函数,重载输出运算符
MyString & operator = (const MyString &);
MyString & operator = (const char * );
char & operator [] (const int index);
private:
char * str;
int len;
};
MyString::MyString() //构造空字符串
{
str = new char[1];
str[0] = '\0';
len = 0;
}
MyString::MyString(const char * const P) //按照动态指针来构造相应的字符串
{
if (P)
{
len = strlen(P); //取长度
str = new char[len + 1]; //开空间
strcpy(str, P); //复制值
}
else
{
MyString(); //如果传入的字符串为空,直接调用缺省值构造函数
}
}
MyString::MyString(const MyString & AnotherMyString) //拷贝构造函数,这里的形参使用了const,该形参类中的所有函数都要使用const来修饰
{
len = AnotherMyString.length();
str = new char[len + 1];
strcpy(str, AnotherMyString.str);
}
int MyString::length() const //求长度成员函数
{
return len;
}
int MyString::size() const
{
return len;
}
const char * MyString::getString()const
{
return str;
}
MyString & MyString::operator=(const MyString &AnotherMyString)
{
if (&AnotherMyString == this)
{
return *this;
}
delete[] str;
len = AnotherMyString.length();
str = new char[len + 1];
strcpy(str, AnotherMyString.str);
return *this;
}
MyString & MyString::operator=(const char * P)
{
delete[] str;
len = strlen(P);
str = new char[len + 1];
strcpy(str, P);
return *this;
}
char & MyString::operator[](const int index)
{
if (index > len) //如果索引越界,输出最后一个字符
{
cout << "Warning!!!" << endl;
cout << "Out of boundary! The last char is: ";
return str[len - 1];
}
else
{
return str[index-1];
}
}
MyString::~MyString() //析构函数
{
delete[] str;
len = 0;
}
ostream & operator << (ostream & output, const MyString & str) //重载输出运算符
{
output << str.getString();
return output;
}
//主函数
int main()
{
MyString a;
cout << "string a = " << a << endl;
cout << "Length = " << a.length() << endl << endl;
MyString b("123456");
cout << "string b = " << b << endl;
cout << "Length = " << b.length() << endl << endl;
MyString c(b);
cout << "string c = " << c << endl;
cout << "Length = " << c.length() << endl << endl;
MyString d = b;
cout << "string d = " << d << endl;
cout << "Length = " << d.length() << endl << endl;
MyString e = "00000000";
cout << "string d = " << e << endl;
cout << "Length = " << e.length() << endl << endl;
MyString f = "abcdefghijklmn";
char str = f[5];
cout << "f[5] = " << str << endl << endl;
return 0;
————————————————
版权声明:本文为CSDN博主「肉蛋葱鸡799」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/qq_68623886/article/details/126295407