天天看点

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;

    }

继续阅读