Mystring类的实现

近期,通过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

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值