重载 * 乘法运算符两次作为成员函数
Overloading * multiplication operator twice as a member function?
向下滚动查看TL:DR。
这个问题与这个问题类似,但有一些不同之处。它涉及将*
运算符重载两次,用于一个名为jVector
的类,它只表示一个二维笛卡尔向量。
第一种乘法是jVector * jVector
,或点积。第二种类型是乘以实数,double * jVector
。这只返回一个向量,其条目乘以双精度
以下是一些代码来说明我正在尝试执行的操作:
class jVector{
public:
double x, y;
jVector(double x_val = 0., double y_val = 0.){
x = x_val;
y = y_val;
}
//Operator overload functions
//[...]
//F1: Dot product (WORKS)
double operator* (jVector& factor){
double result;
result = x * factor.x;
result += y * factor.y;
return result;
}
//F2: Real number multiplication (DOES NOT WORK)
jVector operator* (double f){
jVector result;
result.x = x * f;
result.y = y * f;
return result;
}
//[...]
}
//F3: As a non-member (WORKS)
jVector operator* (double f, jVector V){
jVector result;
result.x = V.x * f;
result.y = V.y * f;
return result;
}
三个相关功能分别标有F1
、F2
和F3
。函数F2
和F3
永远不会同时定义(我注释掉其中一个以测试另一个(。
这是尝试表达类似 2.0 * Foo
的结果,其中 Foo
是 jVector
类型的向量。使用 F3
时,该操作按预期工作,该函数在类外部定义。但是,当仅使用成员函数F2
时,会引发一个错误,指出no match for 'operator*' in '2 * Foo'
。
载运算符时遇到的错误类型相同,这表明我没有正确定义F2
,或者F2
与F1
冲突。
相当确定我的问题与我之前提到的问题不同,因为F1
和F2
有不同的返回类型和参数类型。
TL:DR
所以我的问题来了:为什么我可以重载*
两次,只要其中一个被定义为非成员函数?为什么两个重载函数都不能是类的成员?
它不能作为成员函数工作,因为您的 F2 替代项将jVector
作为第一个操作数 ALWAYS(它是一个成员函数,因此您无法选择第一个参数是什么 - 它是jVector *this
[被语言隐藏](。编译器理论上可以允许两个操作数交换位置(它可以x * 2.0
转换为常规数学运算的2.0 * x
,但由于运算符重载不是为了"交换",如果编译器确实重新排列它们,那不是很好(
要double
第一个操作数,你需要一个独立的函数。
对于成员函数运算符重载,第一个操作数必须是类的对象。 重载函数的参数是第二个操作数。所以:
double operator* (double f){
仅适用于您正在执行a_vector * a_double
的情况,而不适用于a_double * a_vector
。
出于这个原因(和其他原因(,通常最好对重载运算符使用非成员函数。 我建议这样做的方法是:
// member function
jVector & jVector::operator*=( double f )
{
x *= f;
y *= f;
return *this;
}
// free functions
jVector operator* (double f, jVector V) { return V *= f; }
jVector operator* (jVector V, double f) { return V *= f; }
- 从具有按值捕获的 lambda 移动构造 std::函数时,移动构造函数调用两次
- C++析构函数调用两次,堆栈分配的复合对象
- C++两次定义相同的函数会导致错误
- 对于优化级别为 0 的 std::vector,析构函数被调用两次
- 为什么转换运算符调用复制构造函数两次,而等效函数只调用它一次
- 调用一个小函数两次(例如在if条件和主体中)比将结果存储在局部变量中更可取
- 为什么这个自定义分配器的析构函数在 GCC/MSVS 的 stdlib 中被调用两次
- 调用某个回调函数两次会导致分段错误:Nan
- C++:链接库两次,全局构造函数运行两次吗?
- 执行函数两次
- 重载运算符 new(),为什么构造函数被调用两次?
- 带有文件结束函数的 while 循环重复输出文件中的最后一个数字两次
- 为同一存储位置调用构造函数两次是否合法?
- 为什么在下面的代码中调用复制构造函数两次
- 两个单链列表共享同一个节点和析构函数两次删除相同的内存
- 析构函数在 lambda 捕获说明符中声明的类实例上运行两次
- 为什么在这里调用析构函数两次
- while 循环在一个函数调用中执行两次
- 为什么这个构造函数被调用两次
- 用define替换两次函数调用