CPlusPlus容易忽略的概念

#include <iostream>
#include <cstring>
using namespace std;

class mString
{
public:
    mString(const char * buf)//有参构造函数
        :m_buf(strcpy(new char[strlen(buf) + 1 ],buf) )
    {
    }
    mString(const mString& that)//拷贝构造函数
        :m_buf(strcpy(new char[strlen(that.m_buf)+1],that.m_buf) )
    {
        
    }
    virtual ~mString()
    {
        if(m_buf)
        {
            delete m_buf;
        }
    }

    const mString& operator=(const mString& that)//拷贝赋值
    {
        if(&that != this)
        {
            if(m_buf) delete[] m_buf;
            m_buf = strcpy(new char[strlen(that.m_buf)+1],that.m_buf);
        }
        return *this;
    }

    const mString& operator=(const char * buf)//拷贝赋值
    {
        delete[] m_buf;
        m_buf = new char[strlen(buf)+1];
        return *this;
    }



    friend const mString operator+(const mString& left,const mString& right)//重载+(友元函数 非成员函数版本)
    {
        char * tbuf = new char[ strlen(left.m_buf)+strlen(right.m_buf)+1 ];
        mString tt(strcat(strcpy(tbuf,left.m_buf),right.m_buf) ) ;//调用有参构造
        delete[] tbuf;
        return tt;
    }

    const char* mc_str()const
    {
        return m_buf;
    }

    void print()const
    {
        cout<<mc_str()<<endl;
    }


private:
    char * m_buf;
};

int main()
{
    mString str1("aaaa");//有参构造
    str1.print();
    cout<<"----------"<<endl;

    mString str2="bbbb";//拷贝赋值
    str2.print();
    cout<<"----------"<<endl;

    
    mString str3= str1+str2;//重载+
    str3.print();
    cout<<"----------"<<endl;

    mString str4(str3);//拷贝构造
    str4.print();
    cout<<"----------"<<endl;

    const char* (mString::*pfn)()const = &mString::mc_str;//常函数也要加上标识
    cout<<(str1.*pfn)()<<endl;
    cout<<"----------"<<endl;

    void (mString::*pfn2)()const = &mString::print;
    mString *pStr =&str2;
    (pStr->*pfn2)();
    
    getchar();
    
    return 0;
}


你可能感兴趣的:(CPlusPlus容易忽略的概念)