【无标题】自定义实现mystring类

#include <iostream>
#include <cstring>

using namespace std;

class myString               //定义一个类
{
private:
    char *str;               //记录c风格的字符串,这是一个指针,指向一片动态的堆区内存空间
    int size;                //用来记录所存放的字符串的实际长度
public:
    //无参构造用于给类对象申请空间
    myString():size(10)      //构造函数初始化列表
    {
        str=new char[size]; //构造出一个长度为10的字符串
        cout<<"无参构造"<<endl;
    }

    //有参构造
    myString(const char *s)//此处的const修饰的是值,值不可以改变,但是p的指向可以改变
    {
        size=strlen(s);
        str=new char[size+1];
        strcpy(str,s);
        cout<<"有参构造"<<endl;
    }

    //拷贝构造
    myString(const myString & other)
    {
        size=other.size;
        str=new char[size+1];
        strcpy(str,other.str);
        cout<<"拷贝构造"<<endl;
    }

    //拷贝赋值


    //析构函数:在对象消亡时回收对象的内存空间以及善后工作的
    ~myString()
    {
        delete []str;     //先释放之前分配的空间内存数据
        cout<<"析构函数"<<endl;
    }


    //判空函数
    bool empty()
    {
        if(strlen(str)==0)
        {
            return true;
        }
        else
        {
            return false;
        }
    }

    //size函数
    int length()
    {
        return size;
    }

    //c_str函数
    const char * c_str()      //C++风格的字符串转换为C风格字符串需要调用成员函数:c_str()
    {
        return str;
    }

    //at函数:成员访问
    char &at(int pos)
    {
        if(pos>=size || pos<0)
        {
            cout <<"段错误"<<endl;
        }
        return str[pos];
    }
};

int main()
{
    //有参构造函数
    myString s1("nihao");  //赋初值,然后调用有参构造函数
    cout<<"s1= "<<s1.c_str()<<endl;

    //拷贝构造函数
    myString s2(s1);       //把s1的字符串拷贝给s2
    cout<<"s2= "<<s2.c_str()<<endl;

    cout<<"s2.length()="<<s2.length()<<endl;
    cout<<"s2.c_str()="<<s2.c_str()<<endl;
    cout<<"s2.at(2)="<<s2.at(2)<<endl;
    return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,可以参考下面的示例代码: ```c++ #include <iostream> #include <cstring> using namespace std; class mystring { private: char* str; public: mystring() { str = NULL; } mystring(const char* s) { int len = strlen(s); str = new char[len + 1]; strcpy(str, s); } mystring(const mystring& other) { int len = strlen(other.str); str = new char[len + 1]; strcpy(str, other.str); } ~mystring() { if (str != NULL) { delete[] str; str = NULL; } } mystring& operator=(const mystring& other) { if (this != &other) { if (str != NULL) { delete[] str; str = NULL; } int len = strlen(other.str); str = new char[len + 1]; strcpy(str, other.str); } return *this; } friend ostream& operator<<(ostream& os, const mystring& s) { os << s.str; return os; } }; int main() { mystring s1("Hello"); mystring s2 = "World"; mystring s3(s1); cout << "s1: " << s1 << endl; cout << "s2: " << s2 << endl; cout << "s3: " << s3 << endl; s2 = s1; cout << "s2: " << s2 << endl; return 0; } ``` 在上面的代码中,我们自定义了一个字符串 `mystring`,并实现了运算符 `=` 的重载。在 `operator=` 函数中,我们首先判断是否为自赋值,如果不是,就先释放原有的内存空间,再申请新的内存空间,并将字符串拷贝到新的内存中。 在 `main` 函数中,我们创建了三个 `mystring` 型的对象 `s1`、`s2` 和 `s3`,并通过重载的 `<<` 运算符输出它们的值。然后将 `s1` 赋值给 `s2`,并再次输出 `s2` 的值,可以看到 `s2` 的值已经变成了 `Hello`。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值