通过具有重载运算符函数的构造函数自动进行类型转换

Automatic type conversion through constructors with overloaded operator functions

本文关键字:构造函数 类型转换 函数 重载 运算符      更新时间:2023-10-16

我遇到了麻烦。

#include <iostream>
#include <cstdlib>
using namespace std;
class rec
{
private:
    float l;
    float w;
public:
    rec(): l(0) , w(0) {}
    rec(float a)
    {
        l = a;
        w = 0.0;
    }
    rec(float a, float b): l(a) , w(b) {}
    friend rec operator +(rec& , rec&);
    //friend rec operator +(float , rec&);
    friend ostream& operator <<(ostream&, rec&);
};
ostream& operator <<(ostream& out , rec& r3)
{
    out << "l " << r3.l << endl << "w " << r3.w;
    return out;
}
int main()
{
    rec r1(8, 3) , r2(2,7) , r3;
    r3 = 5.0 + r2;
    cout << "sum " << r3;
}
rec operator +(rec r1 , rec r2)
{
    float lsum , wsum;
    lsum = r1.l + r2.l;
    wsum = r1.w + r2.w;
    return rec(lsum , wsum);
}

我认为这里自动类型转换的目的是使r3 = 5.0 + r2其中 5.0 被视为在重载 + 和 <<函数中使用的对象,使友元 rec 运算符 +(float , rec&(;必要。也许我在这里错过了一些东西。

你的代码有两个问题。首先,friend rec operator +(rec& , rec&);将声明一个operator+,该对其参数进行非常量引用。通过构造函数从 float 转换为 rec 将生成临时引用,并且非常量引用不能绑定到临时引用。您应该通过按值或常量引用接受参数来修复它。

第二个问题是operator+的定义与其当前的声明不匹配。