C++ string类实践

自定义了一个MyString类:涉及到了一个类最基本的构造函数、析构函数、深拷贝,内存管理等问题。

头文件:

#ifndef MYSTRING_H
#define MYSTRING_H
#include <iostream>
#include <string.h>
using namespace std;

class MyString
{
public:
    friend ostream &operator<<(ostream &out, const MyString &obj);
    MyString(const char* str=NULL);    //ctor
    MyString(const MyString &obj);    //copy ctor
    ~MyString(); //dtor
    MyString& operator=(const MyString &obj);
    MyString substr(int start, int len);    //返回char* 不好进行内存管理,采用类类型,借鉴string
    void setData(const char* str);
    void display();
private:
    char *m_data;
    int m_len;
};

#endif // MYSTRING_H
CPP文件:

#include "MyString.h"
#include <iostream>
#include <string>
#include <string.h>
using namespace std;

ostream &operator<<(ostream &out, const MyString &obj)
{
    cout << obj.m_data;
    return out;
}

MyString::MyString(const char* str)//默认参数只在声明的时候写上
{
    cout << "调用构造函数:";
    if (str == NULL)
    {
        m_data = NULL;
        return;
    }

    m_len = strlen(str) ;
    m_data = new char[m_len+1];
    strcpy(m_data, str);
    cout << m_data<<endl;
}

MyString::MyString(const MyString &obj)    //拷贝构造函数,使用深拷贝
{
    cout << "调用拷贝构造:";
    if (obj.m_data == NULL)
    {
        m_data = NULL;
        return;
    }
    m_len = strlen(obj.m_data); //这里不能用sizeof,因为指针是无法求其指向内容的大小的,字符数组才可以。
    m_data = new char[m_len+1];
    strcpy(m_data, obj.m_data);
    cout << m_data << endl;
}

MyString & MyString::operator=(const MyString &obj)
{
    if (this != &obj)//检查自赋值
    {
        cout << "释放原有内存..."<< endl;
        MyString temp(obj);    //离开作用于释放内存,释放的是原对象指向的内存
        char *ptemp = m_data;
        this->m_data = temp.m_data;
        temp.m_data = ptemp;
    }
    return *this;
}

MyString::~MyString()
{
    cout << "调用析构: "<< m_data << endl;
    if (m_data != NULL)
    {
        delete[]m_data;
        m_data = NULL;
    }
}

void MyString::display()
{
    cout << m_data << endl;
}

MyString MyString::substr(int start, int len)
{
    if (start < 0 || len < 0)
        return "";
    char* buf = new char[len + 1];
    int i = start;
    int j = start + len ;
    for (int k = i; k < j; k++)
    {
        buf[k - i] = m_data[k];
    }
    buf[len] = '\0';

    return MyString(buf);
}

void MyString::setData(const char* str)
{
    if (m_data != NULL)
    {
        cout << "释放原有内存" << endl;
        delete m_data;
        m_data = NULL;
    }

    if (str == NULL)
        return;
    m_len = strlen(str);
    m_data = new char[m_len + 1];
    strcpy(m_data, str);
    cout << m_data << endl;
}
测试程序:

char p[1000] = { 0 };

    while (1)
    {
        memset(p, 0, sizeof(p));
        cout << "请输入:(按q/Q退出)" << endl;
        cin.getline(p, 1000);
        if (!strcmp(p, "q") || !strcmp(p, "Q"))
            break;
        MyString s(p);//离开作用域自行调用析构函数
        cout << s.substr(0, 3) << endl;//这句话执行就调用析构
        cout << "***********" << endl;
        //s.display();

        MyString s1(s);
        //ss.display();
        cout<<"*******"<<endl;
        MyString s2 = s;
        cout<<"*******"<<endl;
        s2.setData("Hello world!");
        s1 = s2;
    }
 

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值