返回重载运算符的类型 + 表现出奇怪的行为

return type of overload operator + exhibit weird behaviour

本文关键字:重载 运算符 类型 返回      更新时间:2023-10-16

>我有一个班级员工

#include <iostream>
#include <string>
using namespace std;
class employee
{
    public:
            double operator + (employee);
            employee(int);
            double getSalary();
    private:
           double salary;
};
int main()
{  
  employee A(400);
  employee B(800);
  cout<<A+B;
  employee C = A+B;
  cout<<C.getSalary();
}
employee::employee(int salary)
{
    this->salary = salary;
}

double employee::operator + (employee e)
{
    double total;
    total = e.salary + this->salary;
    return total;    
}

double employee::getSalary()
{
    return this->salary;
}

我已经超载了操作员+,因此它加起来了2个员工对象的薪水.重载 + 运算符的返回类型为双精度。

这是我的问题

1(为什么当我重载运算符+返回双精度而不是员工时employee C = A + B工作,不应该有编译器错误吗?

2(实际发生了什么???

当您重载 operator+ 以返回双精度时,编译器将查看它是否可以将该double转换为 employee 对象。由于您有一个接受int的 ctor ,它会从 doubleint 进行隐式转换,然后使用您的 ctor 从 int 转换为 employee

所以不,这不应该产生编译器错误。

同时,这没有多大意义。现在,您已经将employee的薪水成员定义为double,但只允许用户指定初始化它的int。您可能希望允许使用 double 初始化它。

就目前而言,您的operator+也具有非对称行为:它可以在右侧操作数上进行隐式转换,但不能在左侧进行隐式转换,因此a + 1有效,但1 + a不起作用。

您可以通过使转换构造函数

(即可以使用单个参数调用的所有构造函数(explicit来消除所有隐式转换。相反,您可以通过将重载实现为自由函数来允许对左操作数或右操作数进行隐式转换:

employee operator+(employee const &a, employee const &b) { 
    return employee(a.salary + b.salary);
}

由于salary是私有的,因此您必须/必须将此运算符声明为类的好友才能使其工作。

您通常希望执行其中之一。如果隐式转换有意义,则您可能希望在两个操作数上都支持它们。如果它们没有意义,那么您可能希望完全禁止它们。中间立场 - 可以转换一个操作数但不能转换另一个操作数的+很少有意义。

再说一次,我认为支持增加员工是没有意义的。对于我(或者我认为大多数读者(来说,添加两个employee不会立即产生第三个employee对象,其中包含两个employee工资的总和,其余数据无效。事实上,我认为您可能根本不应该允许创建这样一个无效的employee对象。

之所以有效,是因为您指定了此构造函数:

employee(int);

尽管从 double 转换为 int 时您将收到有关数据丢失的警告。因此,当编译器看到双精度时,它会检查是否有任何构造函数采用双精度参数。要使其不起作用,请将构造函数指定为显式:

explicit employee(int);