#include<iostream.h> //注意这里使用带h的头文件,不然在vc里编译通不过
                     //再次强调下,只要是在class member中有 pointer的存在,class 就应该提供 copy constructor 和 operator =.

class A
{
public:
    A():data(0){};
    A(A &b)
    {
        cout << "copy constructor" << endl;
        data = b.data + 2;
    }
    A(int _data):data(_data){};

    A& operator = (A &a)
    {
        cout << "= operator" << endl;
        data = a.data+1;
        return *this;
    }   

      A& operator += (const A &a)
     {
          data += a.data;
          return (*this);
      }

void show(A &a)  //一开始,脑子秀逗啦,以为a.data会发生编译错误,                     
    {                //连下面的友元函数都可以这样用,自己的成员函数为什么不行呢?
        cout << a.data << endl;
    }
    friend void show2(A &a);
    friend A operator + (const A &a, const A &b);
    friend ostream& operator << (ostream &out, A &a);

private:
    int data;
};


void show2(A &a)
{
    cout << a.data << endl;
}

A operator + (const A &a, const A &b)
{
    A temp;
    temp.data = a.data + b.data;
    return temp;
}

ostream& operator << (ostream &aout, A &a)
{
    aout << "I am " << a.data << endl;
    return aout;
}



int main(void)
{
    A a(3);
    A b1=a; //注意,这里调用的是copy构造函数,与A b1(a)是一样的
    A c;
    c = a; //这里,调用的是operator =

    show2(a);
    b1.show(b1);
    c.show(c);

    cout << a;

    A d;
    d = a+a;
    show2(d);

A f1(2);
A f2(2);
f1 += f2;
show2(f1);
return 0; }

输出

copy constructor
= operator
3
5
4
I am 3
copy constructor
= operator
9
4

   (1)最后为什么是9呢,因为在operator +函数里,temp中的data为6,operator +函数结束时,将temp复制给main函数里面的一个临时变量(姑且叫做main_temp),即调用copy构造函数,然后执行operator = 函数,完成d=main_temp的赋值

(2)为什么operator +的返回值不能是引用类型呢,像下面这样
friend A& operator + (const A &a, const A &b);
因为temp的作用域就在operator里面,当该函数结束的时候,temp也就结束啦,这时把一个生命已经结束的变量的地址返回到主函数,这不是笑话吗
(3)
ostream& operator << (ostream &aout, A &a)那这里面的返回值怎么是引用类型啊,因为传递来的参数就是引用类型啊

int main(void)
{
    A a(3);
    A d1 = a+a;
    d1.show();  //10

    A d2;
    d2 = a+a;
    d2.show(); //9

    return 0;
}