C++第四章运算符重载习题-3:转换构造函数 类对象与非类对象顺序任意之和

#include<iostream>

using namespace std;

class Complex
{
public:
    Complex(){real=0,imag=0;}
    Complex(int r){real=r;imag=0;}
    Complex(double r ,double i):real(r),imag(i){}
    friend Complex operator + (Complex c1,Complex c2);
    void display();
private:
    double real;
    double imag;
};

void Complex::display()
{
    cout<<real<<"+"<<imag<<"i"<<endl;
}

Complex operator+(Complex c1,Complex c2)
{
    cout<<"c1=";
    c1.display();
    cout<<"c2=";
    c2.display();
    return Complex(c1.real+c2.real,c2.imag +c1.imag);
}

int main()
{
    Complex c1(3,6),c2,c3;
   // c3=c1+c2;
    c3=c1+4;
    cout<<"c3=c1+4=";
    c3.display();
    c2=4+c1;
    cout<<"c2=4+c1=";
    c2.display();
}
 

文中两处加粗的地方我开始分别写的是:friend Complex operator + (Complex&,Complex&);

                                                                  Complex operator+(Complex &c1,Complex &c2)

之后一直报错 error: no match for 'operator+' (operand types are 'Complex' and 'int')|

之后查找得知: 传参中含有&,则传入参数是一个引用,参数传递的过程中就复制该引用-----(复制:指向同一个变量)

在传递过程中就没有产生新的变量,不会调用构造函数。

传参中不使用&(值传递):在函数调用过程中,传递参数是复制传入的参数生成另外一个变量(要构造一个新的变量----调用构造函数)传入友元函数。

猜你喜欢

转载自blog.csdn.net/n20164206199/article/details/85238800
今日推荐