class Mars
{
private:
    int* ix ;
public:
    Mars(int i_)
    {
        ix = (int*) malloc(sizeof(int)) ;
        *ix = i_ ;
    }
    Mars(const Mars& m)
    {
        ix = (int*) malloc(sizeof(int)) ;
        *ix = *(m.getptr()) ;
    }
    Mars& operator=(const Mars& m)
    {
        if(m.getptr() != ix)
        {
            *ix = *(m.getptr()) ;
        }else
        {
            cout << "the same Mars object" << endl ;
        }
        return *this ;
    }
    Mars(Mars&& m)
    {
        ix = m.getptr();
        m.getptr() = 0x00 ;
    }
    Mars& operator=(Mars&& m)
    {
        if(m.getptr() != ix)
        {
            *ix = *(m.getptr()) ;
            m.getptr() = 0x00 ;
        }
        else
        {
            throw "move operator to self" ;
        }
        return *this ;
    }
    int* getptr() const { return ix; }
    int*& getptr()  { return ix; }
    int  print()
    {
        if(ix != 0x00)
            return *ix;
    }
    void printix(){ printf("(%p)\n",ix);  }
};

int main()
{
    Mars m1(100) ;
    Mars m2(m1) ;
    Mars m3(1000) ;
    m3 = m2 ;
    cout << m1.print() << " " << m2.print() << " " << m3.print() << endl ;
    m1.printix() ;
    m2.printix() ;
    m3.printix() ;

    Mars m5(12345) ;
    Mars m6 = std::move(m5) ;
    cout << m5.print() << " " << m6.print() << endl ;
    m5.printix() ;
    m6.printix() ;

    Mars m7(135) ;
    Mars m8(246) ;
    try
    {
        m7 = std::move(m8) ;
        cout << m7.print() << " " << m8.print() << endl ;
        m7.printix() ;
        m8.printix() ;
    }catch(...)
    {
        cout << "catch !! " << endl ;
    }
}

output :

100 100 100
(0xb49010)
(0xb49030)
(0xb49050)
0 12345
((nil))
(0xb49070)
246 0
(0xb49090)
((nil))

 

arrow
arrow
    全站熱搜

    hedgezzz 發表在 痞客邦 留言(0) 人氣()