C++ 重载运算符作为复制构造函数的参数
我想对重载的C++ 重载运算符作为复制构造函数的参数,c++,C++,我想对重载的运算符*的结果使用复制构造函数。我找到了这样做的方法:从操作符返回引用。我想知道的是: 这样行吗 以下是一个例子: class Foo{ public: double x,y,z; Foo() : x(0), y(0), z(0) {}; Foo(double xi, double yi, double zi) : x(xi), y(yi), z(zi) {}; Foo(const Foo &bar) :
运算符*
的结果使用复制构造函数。我找到了这样做的方法:从操作符返回引用。我想知道的是:
class Foo{
public:
double x,y,z;
Foo() : x(0), y(0), z(0) {};
Foo(double xi, double yi, double zi) : x(xi), y(yi), z(zi) {};
Foo(const Foo &bar) : x(bar.x), y(bar.y), z(bar.z) {};
};
Foo& operator * (const double &b, Foo &a){ // Yep, I want to modify a
a.x *= b;
a.y *= b;
a.z *= b;
return a;
}
int main(){
Foo temp;
Foo bar = 4*temp; // Here is what I want to do!
return 0;
}
我想
const Foo operator *(const double& b, Foo& a)
{
a.x *= b;
a.y *= b;
a.z *= b;
return a;
}
如果您真的想修改a
,可能就是您想要的。我个人会放弃推荐信。返回类型上的const
是确保以下内容所必需的:
Foo a, c;
double b = 1.0;
(a * b) = c;
不合法
你的方法不是做事的标准方法。通常,您将有:
const Foo operator *(const double& b, const Foo& a)
{
return Foo(a.x *b, a.y * b, a.z * b);
}
一种标准的可交换乘法,其中操作数保持不变
1这样可以吗
它的结构很好,行为也很明确。然而,这是非常非常规的,因为二进制算术运算符通常不修改其操作数。这将使代码的用户非常困惑
与通常定义二进制算术运算符的方法相比,您的方法也更具局限性:
Foo get_foo(); // for exposition
Foo bar = 4*get_foo(); // oops, this doesn't work
考虑到非常规性、已证明的局限性以及与传统方法相比缺乏益处,我认为这是不好的
2标准运营商是否使用类似的方法?例如:
int b = 4*4;
没有。没有一个内置的二进制算术运算符是这样工作的。标准库中的重载也没有一个是这样的(我没有检查,但我有信心)
我建议使用通常的方法,尤其是考虑到这是针对3d向量的:
A operator*(const B& lhs, const A& rhs);
操作数是常量引用,因此它们不会被修改,结果是一个可用于初始化变量的新实例
另外,您的自定义复制构造函数与隐式复制构造函数的作用相同,因此它似乎是多余的。对于
运算符*
,我们希望:
- 两个输入保持不变
- 要返回的新对象(按值)
Foo operator * (double a, Foo const & b);
如果要修改temp
=4*temp
,请使用operator*=
作为temp*=4改为code>,它修改temp
并返回其引用:
Foo & operator *= (Foo & a, double b) {
a.x *= b;
a.y *= b;
a.z *= b;
return a;
}
在intb=4*4代码>,您是否希望第二个4
变为16?这就是您的操作员所做的。为什么您不能从它返回一个普通的Foo
?我不明白为什么它不起作用。为什么您的操作员会修改传递给它的Foo
,而不是创建并返回临时文件?@O'Neil Yep,您是对的。这是不同的事情。但我希望在我的示例Implementaloperator*=
中修改它。为什么需要返回引用?谢谢您的回复!我只是想说清楚。我正在实现3D矢量,所以每次键入“vector*3;”向量应该被修改。当你有int
s并且你写inta=3*b
时,b
不会被修改。您想要的值现在位于a
中。在这里,如果你想让它成为标准的方式,看起来是一样的。好的,如果你不需要它是标准的,我建议你编辑你的问题来移除它。所以对于你想要的方法来说,可以,减去引用(它是合法的C++并且做你想要的),但是我会给返回类型添加<代码> const <代码>。谢谢你的回复!我应该在Begging上写:我正在实现3D矢量,所以每次我输入'vector*3;'向量应该被修改。@Constructovec为什么你认为vector
应该被那个表达式修改?这不是程序员所期望的3d向量的行为。我建议vector
不应被该表达式修改。但还会发生什么呢?我的意思是,向量与数字相乘还能做什么?@Constructovec“还能发生什么”->函数可以返回相乘的结果。这就是内置操作符的工作方式,也是标准库中所有重载的工作方式。“向量与数字相乘还能做什么?”->我不理解你的问题。@C直觉上,我会说几何向量与数字相乘的结果将是一个新的几何向量,其每个维度是向量操作数和数字操作数的相应维度的乘积。是的,我们通常会例外。但这里我要处理的是向量,这个运算对向量有不同的效果,比如整数。很抱歉,我的问题不清楚,无法确定这一时刻。@Constructovec无论类型是什么,我们都希望出现这种行为。Vector包含在内。对不起,我的英语非常好:)我编辑了我的问题。所以当我编写一些程序时,最好使我的程序的行为尽可能类似于普遍接受的(类似程序的)行为?你说我的操作员的行为是出乎意料的。我想知道:让一切都变得传统(可以期待)更好吗?