新手求指导C++关于重载的有关问题,对高手来说是很简单的一个有关问题

新手求指导C++关于重载的问题,对高手来说是很简单的一个问题
本人初学C++,遇到了一些问题,
1.本人用的是XCODE6.0,而教材用的都是VC++6.0,老师说其实VC++6.0早就应该被淘汰了,所以建议我用XCODE试试,但是问题就来了,教材的内容都是默认VC++6.0的呀,我在用XCODE学习的过程中把教材的代码打进去,经常会发现报错,现在自己很疑惑,求指导一二。

2.我的问题就是在重载运算符这里,

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

class complex{
    double real,image;
public:
    complex(double r=0,double i=0){real=r;image=i;}
    complex(complex&com){
        real=com.real;
        image=com.image;
    }
    void print(){
        cout<<"呵呵"<<endl;
    }
    
    friend complex operator+(const complex&,const complex&);
    friend complex operator+=(complex&,const complex&);
    friend double abs(complex&);
    friend complex operator*(const complex&,const complex&);
    friend complex operator/(const complex&,const complex&);
    
};

complex operator+(const complex& c1,const complex& c2){
    
    return complex(c1.real+c2.real,c1.image+c2.image);
}

问题就是+号的定义那里,以上是教材给的内容,直接返回无名的对象XCODE会报错,如果建立一个临时变量,再赋值再返回反而不会。。。。。。为什么?

3.class complex{
    double real,image;
public:
    complex(){real=0;image=0;}
    complex(double r,double i){
        real=r;
        image=r;
    }
    complex(complex&com){
        real=com.real;
        image=com.image;
    }
    void display();
    complex operator-(complex&com);
    complex operator/(complex&com);
    complex operator*(complex&com);
    friend complex operator+(const complex &,const complex & );
    double abs();
};
中间省略——————————————————————————————
complex operator+(const complex & com1, const complex & com2){
    complex temp;
    temp.real=com1.real+com2.real;
    temp.image=com1.image+com2.image;
    return temp;
}
——————————————————————————————

int main(){
double d=0.5;
complex c1(1,1),c;

c=c1+d;
}


本来想实现的是只定义一个函数就可以实现复数和复数的假发,复数和实数的加法,实数和实数的加法,以上也是教材的内容,但是主函数那里c=c1+d报错,invalid operands to binary expression('complex'and 'double'),无效操作数?这又是什么情况,第一次遇到,求帮帮忙。第一次发帖。



------解决思路----------------------
complex(complex&com)---》complex(const complex&com)看看你还会报错不
------解决思路----------------------
第一个需要正确的复制构造函数。

    complex(complex const&com){
        real=com.real;
        image=com.image;
    }

第二个需要接受 double 的单参数构造函数,比如:

 complex(double r){
  real=r;
  image=0;
 }

------解决思路----------------------
你这里返回值优化需要有const &参数的拷贝构造函数才会执行