将复数运算符+(double,complex)作为成员函数实现
Implements complex operator+(double,complex) as a member function
我已经阅读了N3797工作草案13.5部分,我有一个问题。设complex
为表示复数的类类型。可以定义以下操作符函数:
complex operator+(double d, complex c)
{
return *new complex(d+c.get_real(),c.get_imagine());
}
但是如何将这个操作符函数实现为复杂的成员函数呢?或者我必须在我打算使用它们的每个模块中声明这个操作符函数吗?
有两种方法可以在两个类型之间定义二元操作符重载,例如二元+操作符。
-
作为成员函数。
定义为成员函数时,操作符的LHS是类的实例。操作符的RHS是函数的实参。这就是为什么当你将它定义为成员函数时,它只能有一个参数。
-
作为自由函数
这些函数必须有两个参数。第一个实参是操作符的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
工作。正如其他人指出的那样,您正在泄漏内存。
- 三向比较运算符成员与非成员实现
- 多次实现成员功能
- 可以具有不同基成员实现的类的最佳实现
- 如何为非常量和常量重载实现一次成员函数?
- 基于自定义void_t实现的成员检测
- 将C++子类成员函数(虚拟实现)传递给 C 类型函数指针
- C++ 20 中的运算符 == 和 <=> 应该作为成员还是自由函数实现?
- 如何为具有私有成员的派生类实现移动构造函数
- 在C++中实现类似 python "map"函数的问题:调用类成员函数
- 在C++中使用链表的堆栈实现中,访问结构体headNode成员count和top会导致运行时错误
- C++ 入门 12.1:我可以在类中使用静态向量成员实现 StrBlob<string> 吗?
- 使用 PIMPL 惯用法,实现是否应始终是类的私有成员?
- 如何将已实现的虚拟成员函数作为参数传递
- std::add_pointer 非静态成员函数的实现
- 为什么在std::optional的某些实现中有一个虚拟工会成员?
- 成员功能C 的不同实现
- 在.cpp文件中实现时访问私有成员
- 是否可以使用抛出交换成员实现?
- 如何在cpp文件中为多个类型创建模板类成员实现?
- 用int成员实现哪些操作符