我已经阅读了N3797工作草案的 13.5 部分,并且我提出了一个问题。设complex
为表示复数的类类型。我们可以定义以下运算符函数:
complex operator+(double d, complex c)
{
return *new complex(d+c.get_real(),c.get_imagine());
}
但是这个运算符函数如何作为一个复杂的成员函数实现?或者我必须在我打算使用它们的每个模块中声明这个操作符函数吗?
答案 0 :(得分:2)
您正在寻找的是:
inline complex operator +(double d, const complex& c)
{
return complex(d+c.get_real(), c.get_imagine());
}
如果您希望运算符将运算符的左侧作为double
处理,则不能是成员函数。它必须是一个免费的功能,如果需要访问除complex
的公共接口之外的任何内容,可能会有用。
如果您希望加载项的正确方面为double
,则可以制作成员函数:
complex operator +(double d) const
{
return complex(d+get_real(), get_imagine());
}
请注意,这是假设此定义位于complex
类定义的主体内。但为了清楚起见,我建议两个都是内联自由函数。
隐含构建
与通常的嫌疑人一起排队,你最近尝试做的事情通常是使用隐式转换构造函数和一般的自由函数。提供这个:
complex(double d) : real(d), imagine()
{
}
在类定义中,double可以在需要时隐式构造临时complex
。这允许:
inline complex operator +(const complex& lhs, const complex& rhs)
{
return complex(lhs.get_real() + rhs.get_real(),
lhs.get_imagine() + rhs.get_imagine());
}
用作所有合理表现的一般解决方案。
答案 1 :(得分:2)
有两种方法可以在两种类型之间定义二元运算符重载,例如二元运算符。
作为会员功能。
当您将其定义为成员函数时,运算符的LHS是类的实例。运算符的RHS是函数的参数。这就是为什么当你把它定义为成员函数时,它只能有一个参数。
作为免费功能。
这些函数必须有两个参数。第一个参数是运算符的LHS,第二个参数是运算符的RHS。
由于double
不是一个类,您必须将double
之间的operator +重载定义为LHS,将complex
定义为RHS作为自由函数,double const&
或{{ 1}}作为第一个参数类型,double
或complex const&
作为第二个参数类型。
答案 2 :(得分:1)
在C ++中,运算符重载需要类类型。您不能为基本类型+
重载double
运算符。
此外,除了在某些情况下(短期程序或一次性代码),应该捕获调用new
运算符产生的指针,以便稍后可以使用delete
释放它,防止出现内存泄漏的情况。
答案 3 :(得分:0)
要使其成为成员,第一个参数必须是类类型(尽管未明确指定)。但是你发送double
作为第一个参数。如果您需要这项功能,请使用friend
功能或只使用non-member
功能,该功能只能使用public interface
类的Complex
。正如其他人指出的那样,你正在泄露记忆。