gpt4 book ai didi

c++ - 重载 * 乘法运算符两次作为成员函数?

转载 作者:行者123 更新时间:2023-11-27 23:00:13 29 4
gpt4 key购买 nike

向下滚动 TL:DR。

这个问题类似于this一,但有一些区别。它涉及为名为 jVector 的类重载两次 * 运算符,该类仅表示二维笛卡尔 vector 。

第一种乘法是jVector * jVector,或dot product .第二种是乘以实数,double * jVector。这只是返回一个 vector ,其条目乘以 double 。

下面是一些代码来说明我正在尝试做的事情:

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;
}

三个相关函数被标记为F1F2F3。函数 F2F3 永远不会同时定义(我注释掉其中一个以测试另一个)。

这是尝试表达类似于 2.0 * Foo 的结果,其中 FoojVector 类型的 vector 。当使用 F3 时,该操作按预期工作,这是在类外部定义的函数。但是,当仅使用成员函数 F2 时,会出现一个错误,提示 no match for 'operator*' in '2 * Foo'

如果您根本不重载运算符,这与您遇到的错误类型相同,表明我没有正确定义 F2,或者 F2F1 冲突。

我相当确定我的问题与 question I mentioned 中的问题不同较早前,因为 F1F2 具有不同的返回类型参数类型。

TL:DR

所以这是我的问题:为什么我能够重载 * 两次,只要其中一个被定义为非成员函数?为什么两个重载函数不能都是类的成员?

最佳答案

它不能用作成员函数,因为您的 F2 替代方案始终将 jVector 作为第一个操作数(它是一个成员函数,因此您无法选择第一个操作数参数是 - 它是 jVector *this [被语言隐藏])。理论上,编译器可以允许两个操作数交换位置(它可以将 x * 2.0 转换为 2.0 * x 以进行常规数学运算,但由于运算符重载不是被“交换”,如果编译器重新安排它们,那将不是很好)

要使第一个操作数成为double,您需要一个独立的函数。

关于c++ - 重载 * 乘法运算符两次作为成员函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28466864/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com