将复数运算符+(double,complex)作为成员函数实现

Implements complex operator+(double,complex) as a member function

本文关键字:成员 实现 函数 complex 运算符 double      更新时间:2023-10-16

我已经阅读了N3797工作草案13.5部分,我有一个问题。设complex为表示复数的类类型。可以定义以下操作符函数:

complex operator+(double d, complex c)
{
    return *new complex(d+c.get_real(),c.get_imagine());
}

但是如何将这个操作符函数实现为复杂的成员函数呢?或者我必须在我打算使用它们的每个模块中声明这个操作符函数吗?

有两种方法可以在两个类型之间定义二元操作符重载,例如二元+操作符。

  1. 作为成员函数。

    定义为成员函数时,操作符的LHS是类的实例。操作符的RHS是函数的实参。这就是为什么当你将它定义为成员函数时,它只能有一个参数。

  2. 作为自由函数

    这些函数必须有两个参数。第一个实参是操作符的LHS,第二个实参是操作符的RHS。

由于double不是类,必须将double定义为LHS, complex定义为RHS,作为自由函数,将double const&double定义为第一个参数类型,将complex const&complex定义为第二个参数类型。

你要找的是这个:

inline complex operator +(double d, const complex& c)
{
    return complex(d+c.get_real(), c.get_imagine());
}

如果您希望操作符处理操作符的左侧作为double,则不能将其作为成员函数。它必须是一个自由函数,如果需要访问complex的公共接口之外的任何东西,则可能是友元。

如果您希望add-op的一侧为double,则可以创建成员函数:

complex operator +(double d) const
{
    return complex(d+get_real(), get_imagine());
}

注意,这是假设该定义在complex类定义的主体内。但是为了清晰起见,我建议都是内联自由函数。


隐式建筑

与常见的疑点排列在一起,您至少看起来试图做的事情通常是通过隐式转换构造函数和一般自由函数完成的。通过提供这个:

complex(double d) : real(d), imagine() 
{
}

类定义中的双精度对象可以隐式地在需要的地方构造临时的complex。这允许这样做:

inline complex operator +(const complex& lhs, const complex& rhs)
{
    return complex(lhs.get_real() + rhs.get_real(), 
                   lhs.get_imagine() + rhs.get_imagine());
}

要作为一个通用的解决方案,以所有显式的表现,你似乎想。

在c++中,操作符重载需要类类型。不能为基本类型double重载+操作符。

此外,除了在某些情况下(寿命较短的程序或一次性代码),调用new操作符产生的指针应该被捕获,以便它可以稍后与delete一起释放,防止称为内存泄漏的情况。

要使其成为成员,第一个形参必须是类类型(尽管没有显式指定)。但是你发送的是double作为第一个参数。如果您需要此工作,要么使其friend函数或non-member函数,只能使用Complex类的public interface工作。正如其他人指出的那样,您正在泄漏内存。