巨兔12138 发表于 2020-9-13 15:00:11

转换构造函数无法正常使用

#include<iostream>

using namespace std;

class Complex
{
private:
        int real;
        int imag;
public:
        Complex() { real = 0; imag = 0; }
        Complex(int r,int i):real(r),imag(i){ }

        Complex(int r); //转换构造函数声明

        Complex operator+(Complex& c2);
        friend ostream& operator<<(ostream& output, Complex& c2);
};

//转换构造函数定义
Complex::Complex(int r)
{
        real = r;
        imag = 0;
}

Complex Complex::operator+(Complex& c2)
{
        return(real + c2.real, imag + c2.imag);
}

ostream& operator<<(ostream& output, Complex& c2)
{
        output << "(" << c2.real << "," << c2.imag << "i)";
        return output;
}

int main()
{
        Complex c1(1, 1), c2;
        c2 = c1 + 2;
}

大神们帮忙看一下,声明和定义转换构造函数的时候编译器没报错
定义+的重载也没报错
但是在语句“c2=c1+2"中,编译器提示+用错了
但是我觉得2已经被转换为Complex类了啊应该没错啊
请各位大神指出是哪里做错了

风过无痕丶 发表于 2020-9-13 16:17:00

那这个2 是什么时候被转换成Complex的呢。

这个是百度给的关于转换构造函数的解释

说到底! 他还是一个构造函数,你是显示的定义了一个Complex的对象,还是怎么样返回了一个Complex的匿名对象吗。都没有!那这个2,他就只能是个int的字面值!

测试一下转换构造函数怎么才会被调用

Complex::Complex(int r)
{
    real = r;
    imag = 0;

    cout << "Complex(int r) function is called!" << endl;
}

1.第一种
    Complex(2);
    Complex c3(2);

结果:


第二种:
Complex Test() {

    return 100;
}

结果:


当然。。还有很多方法。这只是举俩例子

巨兔12138 发表于 2020-9-13 16:56:14

风过无痕丶 发表于 2020-9-13 16:17
那这个2 是什么时候被转换成Complex的呢。

这个是百度给的关于转换构造函数的解释


好的,谢谢啦
页: [1]
查看完整版本: 转换构造函数无法正常使用