类的成员函数(构造、析构、拷贝构造、赋值、运算符重载)的实现

以String类为例实现其成员函数

class String
{
    //友元函数重载运算符
    friend ostream& operator<<(ostream &out,String& str);
    friend istream& operator>>(istream& in, String& str);
public:
    //通用构造函数
    String(const char* str)
    {
        if(!str)    //对m_data加NULL判断
        {
            length = 0;
            m_data = new char[1];   //对空字符串自动申请存放结束标志'\0'的空
            *m_data = '\0';
        }
        else
        {
            length = strlen(str);
            m_data = new char[length + 1];
            strcpy(m_data, str);
        }
    }
    //析构函数
    virtual ~String()
    {
        delete[] m_data;
    }

    //拷贝构造
    String(const String &str)   //输入参数为const型
    {
        length = str.length;
        m_data = new char[length+1];
        strcpy(m_data, str.m_data);
    }

    //赋值构造
    String& operator=(const String &str)    //输入参数为const型
    {
        if (this == &str)   //检查自赋值
            return *this;
        delete[] m_data;
        int length = strlen(str.m_data);
        m_data = new char[length + 1];
        strcpy(m_data, str.m_data);
        return *this;   //返回本对象的引用
    }

    //重载+
    String operator+(const String &str) const
    {
        String newString("");
        newString.length = length + strlen(str.m_data);
        newString.m_data = new char[newString.length + 1];
        strcpy(newString.m_data, m_data);
        strcat(newString.m_data, str.m_data);
        return newString;
    }

    //重载[]
    inline char& operator[](int n)
    {
        if (n > length)
            return m_data[length - 1];
        else
            return m_data[n];
    }

    //重载+=
    String& operator+=(const String& str)
    {
        length += str.length;
        char *newData = new char[length + 1];
        strcpy(newData,m_data);
        strcat(newData, str.m_data);
        delete[] m_data;
        m_data = newData;
        return *this;
    }

    //重载==
    inline bool operator==(const String& str) const
    {
        if (length != str.length)
            return false;
        return strcmp(m_data, str.m_data) ? false : true;
    }

    inline size_t size() const
    {
        return length;
    }

private:
    char* m_data;
    size_t length;
};

//为什么要重载为友元函数?
/*如果是双目运算符,只要设置一个参数作为右侧运算量,左侧运算符就是对象this本身
 *但是>>或<<左侧运算符是cin或cout而不是对象本身,只能声明为友元了
 *如果一定要声明为成员函数,只能声明为ostream & operator<<(ostream &output)
 *在运用这个<<运算符时就变为这种形式了:data<<cout;不合符人的习惯。
 */

ostream& operator<<(ostream& out,String& str)
{
    out << str.m_data;
    return out;
}

istream& operator>>(istream& in,String& str)
{
    char temp[1024];
    in >> temp;
    str.length = strlen(temp);
    str.m_data = new char[str.length + 1];
    strcpy(str.m_data, temp);
    return in;
}

猜你喜欢

转载自www.cnblogs.com/WindSun/p/11434393.html