zoukankan      html  css  js  c++  java
  • *** 自写MyString类:重载操作符 '+'

    #include <iostream>
    #include <string.h>
    
    using namespace std;
    
    
    class MyString
    {
    public:
        MyString(const char * s=NULL)
        {
            if (s == NULL)
            {
                m_string = new char[1];
                m_string[0] = '';
            }
            else
            {
                m_string = new char[strlen(s)+1];
                strcpy(m_string, s);  
            }
        
        }
        
        ~MyString()
        {
            cout << "destructor: " << m_string << endl;
            delete [] m_string;
            m_string = NULL;
        }
    
        MyString & operator= (const MyString & s);
        MyString & operator+ (const MyString & s);
        friend MyString & operator+ (const MyString & left, const MyString & right);
        char * str(void);
    
    //private:  // 为了支持上面的friend 操作符复用& ,需要将m_string开放的public,否则应为private。
        char * m_string;
    };
    
    MyString & MyString::operator= (const MyString & s)
    {
        if (this == &s)
            return *this;
        
        if (m_string != NULL) // 这句其实可以不要,因为构造函数保证了任何对象的m_string都不会是NULL
            delete [] m_string;
    
        m_string = new char[strlen(s.m_string)+1];
        strcpy (m_string, s.m_string);
    }
    
    
    MyString & MyString::operator+ (const MyString & s)
    {
        cout << "class: " << endl;
        if (strlen(s.m_string) == 0)
        {
            return *this;
        }
        
        MyString * p = new MyString;
        delete [] p->m_string;
        p->m_string = new char[strlen(m_string)+strlen(s.m_string)+1];
        
        strcpy (p->m_string, m_string);
        strcat (p->m_string, s.m_string);
        
        return *p;
    }
    
    // 强制重载操作符 &,用做加号
    MyString & operator+ (const MyString & left, const MyString & right)
    {
        cout << "friend: " <<endl;
        MyString * p = new MyString;
        delete [] p->m_string;
        p->m_string = new char[strlen(left.m_string)+strlen(right.m_string)+1];
        
        strcpy (p->m_string, left.m_string);
        strcat (p->m_string, right.m_string);
        
        return *p;
    }
    
    char * MyString::str(void)
    {
        return m_string;
    }
    
    int main()
    {
        
        MyString a("jason");
        MyString b("becky");
        
        MyString & c = a + b; // 当既定义了成员函数,也定义了普通函数(类外),类的成员函数会被执行。注释掉成员函数后,普通函数才会被调用。
    
        cout << "c:" << c.str() << endl;
    
        delete &c;
    
    
        return 0;
    }
  • 相关阅读:
    TCP报文
    TCP概述
    UDP
    传输层概述
    端口地址转换 PAT
    网络地址转换NAT原理介绍
    js的时间处理函数
    正则表达式相关笔记
    微信小程序实现图片拖拽
    在React中使用less
  • 原文地址:https://www.cnblogs.com/superrunner/p/10111990.html
Copyright © 2011-2022 走看看