gpt4 book ai didi

c++ - 在 C++ 中永远不会调用重载运算符

转载 作者:太空宇宙 更新时间:2023-11-04 14:51:35 24 4
gpt4 key购买 nike

我正在编写一个数学库作为一项实践练习。我在重载 = 运算符时遇到了一些问题。当我调试它时,我注意到对 vertex1 = vertex2 的调用调用了复制构造函数。

在我的头文件中:

//constructors
vector3();
vector3( vector3 &v );
vector3(float ix, float iy, float iz);

//operator overloading
vector3 operator =(vector3 p);
....

在我实现的源文件中:

vector3 vector3::operator =(vector3 p)
{
vector3 v3;
v3.x = p.x;
v3.y = p.y;
v3.z = p.z;
return v3;
}

稍后我有一个叉积方法,我想这样使用它:

vector3 v3;
v3 = v1.crossProduct(v2);

错误信息是: 错误:没有匹配函数来调用“vector3::vector3(vector3)”但我不想调用复制构造函数。

最佳答案

您的代码中有错误。您的复制构造函数必须采用 const&。该引用将避免制作拷贝(作为复制构造函数,您将无法做到这一点),并且它应该是 const 因为您没有修改它:

vector3(const vector3&);

临时变量可以绑定(bind)到const&,但不能绑定(bind)到可变引用。也就是说,使用您的代码您可以:

vector3 a;
vector3 b(a);

但不是:

vector3 a(some_calculation()); // some_calculation returns a vector3

此外,您的 operator= 不正确。与复制构造函数一样,它通常应该采用 const&但它应该返回对 this 的引用。这就是链接的工作原理:

int a, b, c;
a = b = c = 0;
// a.operator=(b.operator=(c.operator=(0)));

返回一个临时文件是非正统的,并且不会完成任何事情。在您的情况下,您可以一遍又一遍地分配并且永远不会更改值。 奇怪:

vector 3 a, b;
a = b; // doesn't change a...?!

operator= 需要更改this

关于c++ - 在 C++ 中永远不会调用重载运算符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2261756/

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