C++赋值运算符、函数调用运算符、下标运算符(“=”、“()”、“[]”)重载

来源:互联网 发布:sql exists用法 编辑:程序博客网 时间:2024/04/30 04:49
转自 http://blog.163.com/hbu_lijian/blog/static/126129153201211545633152/

//对于一般的类,如Complex类,系统会默认重载赋值运算符,但有些类对于系统默认的赋值运算符无法满足要求,这个时候就要用户自己来重载赋值运算符。另外,赋值运算符只能用成员函数重载,不能用友元函数重载。
#include <iostream>
#include <assert.h>
#include <string.h>

using namespace std;

class cstring
{
public:
    cstring(char *str="");
    cstring(const cstring &str);

    cstring operator+(const cstring &str);
    //赋值运算符只能用成员函数重载,不能被继承,用户自己不重载系统会默认冲在一个(但不一定能满足要求)
    cstring &operator=(const cstring &str);
    //重载函数调用运算符,只能用成员函数
    int operator()();
    //重载下标运算符,只能用成员函数
    char operator[](int i);
    void print(void);

private:
    char *m_pstr;
    int m_isize;
};

cstring::cstring(char *str)
{
    if(str == NULL)
    {
        m_isize = 0;
        m_pstr = NULL;
    }
    else
    {
        m_isize = strlen(str) + 1;
        m_pstr = new char[m_isize + 1];
        assert(m_pstr);
        strcpy(m_pstr,str);
    }
}

cstring::cstring(const cstring &str)
{
    if(str.m_isize == 0)
    {
        m_isize = 0;
        m_pstr = NULL;
    }
    else
    {
        m_isize = str.m_isize;
        m_pstr = new char[m_isize];
        assert(m_pstr);
        strcpy(m_pstr,str.m_pstr);
    }
}

cstring cstring::operator +(const cstring &str)
{
    cstring s1;

    s1.m_isize = str.m_isize + m_isize - 1;
    s1.m_pstr = new char[s1.m_isize];
    assert(s1.m_pstr);
    strcpy(s1.m_pstr,m_pstr);
    strcat(s1.m_pstr,str.m_pstr);
    return s1;
}

cstring & cstring::operator =(const cstring &str)
{
    if(&str == this)
    {
        return *this;
    }
    if(m_isize > 0)
    {
        delete []m_pstr;
    }
    m_isize = str.m_isize;
    m_pstr = new char[m_isize];
    assert(m_pstr);
    strcpy(m_pstr,str.m_pstr);
    return *this;
}

int cstring::operator ()()
{
    return m_isize;
}

char cstring::operator [](int i)
{
    if(i >= m_isize)
    {
        return '\0';
    }
    else
    {
        return m_pstr[i];
    }
}

void cstring::print()
{
    cout << m_pstr << endl;
}

int main(int argc,char *argv[])
{
    cstring s1("hello"),s2(" every one!"),s3;
    s3 = s1 + s2;
    s3.print();
    cout << s3() << endl;
    cout << s3[8] << endl;
    return 0;
}