C++学习历程(四)对字符串类的运算符重载(多文件编译)

1.首先创建.h文件,作为头文件,其中包含类的成员变量和重载成员函数。

#ifndef _MYSTRING_H
#define _MYSTRING_H
#include <iostream>

using namespace std;

class MyString
{
    private:
        int m_length;
        char *m_data;
    public:
        MyString();
        MyString(char *str);
        MyString(int a,char ch);
        MyString(const MyString &s);
        //~MyString();
        
        // << >>
        friend ostream &operator <<(ostream &out ,const MyString &s);
        friend istream &operator >>(istream &in , MyString &s);
        
        //重载 = 运算符
        MyString &operator =(char *str);
        MyString &operator =(const MyString &s);

        //重载 []运算符
        char &operator [](int index);

        MyString &operator +(char *str);
        MyString &operator +(const MyString &s);
        MyString &operator +=(char *str);
        MyString &operator +=(const MyString &s);

        //重载 ==,!= 运算符
        bool operator ==(char *str);
        bool operator ==(const MyString &s);
        bool operator !=(char *str);
        bool operator !=(const MyString &s);
    
        //重载 >,<运算符
        bool operator >(char *str);
        bool operator >(const MyString &s);
        bool operator <(char *str);
        bool operator <(const MyString &s);
};

#endif

2.创建.cpp文件,string.cpp,用于编写重载成员函数。

#include "mystring.h"
#include <iostream>
#include <cstring>

using namespace std;

MyString::MyString()
{
    m_length = 0;
    m_data = NULL;
}

MyString::MyString(char *str)
{
    m_length = strlen(str);
    m_data = new char[m_length + 1];
    strcpy(m_data,str);
    m_data[m_length] = '\0';
}

MyString::MyString(int a,char ch)
{
    m_length = a;
    m_data = new char[m_length + 1];
    for(int i = 0;i < m_length;i++)
    {
        m_data[i] = ch;
    }
    m_data[m_length] = '\0';
}

MyString::MyString(const MyString &s)
{
    m_length = s.m_length;
    m_data = new char [m_length + 1];
    strcpy(m_data,s.m_data);
}
/*
MyString::~MyString()
{
    delete[m_length]m_data;
}*/

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

istream &operator >>(istream &in,MyString &s)
{
    char tmp[100];

    in >> tmp;

    s.m_length = strlen(tmp);

    s.m_data = new char[s.m_length + 1];

    strcpy(s.m_data,tmp);
    s.m_data[s.m_length] = '\0';

    return in;
}

MyString &MyString::operator =(char *str)
{
    m_length = strlen(str);
    m_data = new char[m_length + 1];
    strcpy(m_data,str);
    m_data[m_length] = '\0';

    return *this;
}

MyString &MyString::operator =(const MyString &s)
{
    if(m_data == NULL)
    {
        m_length = s.m_length;
        m_data = new char[m_length + 1];
        strcpy(m_data,s.m_data);
        m_data[m_length] = '\0';
    }
    return *this;
}

char &MyString::operator [](int index)
{
    return m_data[index];
}

MyString &MyString::operator +(char *str)
{
    char *temp;

    temp = m_data;
    m_length = m_length + strlen(str);
    m_data = new char[m_length + 1];
    strcpy(m_data,temp);
    strcat(m_data,str);

    delete []temp;

    return *this;
}

MyString &MyString::operator +(const MyString &s)
{
    char *temp;

    temp = m_data;
    m_length = m_length + strlen(s.m_data);
    m_data = new char[m_length + 1];
    strcpy(m_data,temp);
    strcat(m_data,s.m_data);

    delete []temp;

    return *this;
}

MyString &MyString::operator +=(char *str)
{
    char *temp;

    temp = m_data;
    m_length = m_length + strlen(str);
    m_data = new char[m_length + 1];
    strcpy(m_data,temp);
    strcat(m_data,str);
   
    delete []temp;

    return *this;
}

MyString &MyString::operator +=(const MyString &s)
{
    char *temp;

    temp = m_data;
    m_length = m_length + strlen(s.m_data);
    m_data = new char[m_length + 1];
    strcpy(m_data,temp);
    strcat(m_data,s.m_data);
   
    delete []temp;

    return *this;
}


bool MyString::operator ==(char *str)
{
    if(m_data == str)
        return true;
    else
        return false;
}

bool MyString::operator ==(const MyString &s)
{
    if(m_data == s.m_data)
        return true;
    else
        return false;
}

bool MyString::operator !=(char *str)
{
    if(m_data != str)
        return true;
    else
        return false;
}

bool MyString::operator !=(const MyString &s)
{
    if(m_data != s.m_data)
        return true;
    else
        return false;
}

bool MyString::operator >(char *str)
{
    if(m_data > str)
        return true;
    else
        return false;
}

bool MyString::operator >(const MyString &s)
{
    if(m_data > s.m_data)
        return true;
    else
        return false;
}

bool MyString::operator <(char *str)
{
    if(m_data < str)
        return true;
    else
        return false;
}

bool MyString::operator <(const MyString &s)
{
    if(m_data < s.m_data)
        return true;
    else
        return false;
}

3.最后创建main.cpp文件,编写主函数

#include "mystring.h"
#include <iostream>
#include <cstring>

using namespace std;

int main(int argc, char **argv)
{
    MyString s1("laowangbawei");
    MyString s2(10,'a');
    MyString s3(s2);

    cout << s1 << endl;
    cout << s2 << endl;
    cout << s3 << endl;
    
    s1 = "xiaojibatao";
    cout << s1 << endl;

    //cin >> s2;
    //cout << s2 << endl;

    cout << s1[5] << endl;

    cout << "*******************" << endl;

    MyString s6 = "hello";
    MyString s7("5465465");

    s1 = s1 + s6;
    s2 += s7;

    cout << "s1 + s6 = " << s1 << endl;
    cout << "s1 + s7 = " << s2 << endl;
    cout << "s1 + laowangba = " << s1 + "laowangba" << endl;

    if(s1 == s2)
    {
        cout << "s1 == s2" << endl;
    }
    else
        cout << "s1 != s2" << endl;

    return 0;
}

猜你喜欢

转载自blog.csdn.net/zhanganliu/article/details/79807795