gpt4 book ai didi

c++ - 在 C++ 中返回类的最佳方式

转载 作者:行者123 更新时间:2023-11-30 00:55:25 25 4
gpt4 key购买 nike

我正在为一个项目编写一个 C++ vector 类,我很难决定如何最好地编写一些方法。在我开始之前,我会说这个类有一个很好的复制构造函数和赋值运算符(这将在一秒钟内相关)。该类有一组静态方法,当我想确保两个参数都没有改变时返回 vector ,它们具有如下签名:

Vector* Vector::subtract(const Vector* v, const Vector* u)
{
double outX = v->myX - u->myX;
double outY = v->myY - u->myY;
double outZ = v->myZ - u->myZ;

return new Vector(outX, outY, outZ);
}

我遇到的问题是,如果可以的话,我不想返回指针。所以我做了一些测试并意识到如果我只是说

return Vector(outX, outY, outZ)

然后像这样分配结果

Vector foo = Vector::subtract(bar, temp)

它将创建一个拷贝并正常工作。这就是我的问题所在:我只是两次(基本上)调用了构造函数,有没有办法解决这个问题?其次,如果我将此方法用作另一个方法的参数,例如

foo.multiply(&Vector::subtract(foo, bar), 5)

它是否仍会创建一个拷贝,还是我只是在 Vector::subtract 方法中传递了超出范围的指针?

更一般地说,最好的(或者至少有更好的)方法是什么?

最佳答案

I just called the constructor twice (essentially) is there a way to get around that?

你听说过Return Value Optimization吗? ?您无需做任何事情。编译器很可能会为您删除拷贝。现在,如果您使用 C++11 并且 Vector 类管理资源,您还可以声明一个移动构造函数,以便在编译器决定它无法执行 RVO 时移动返回值。但是,看起来该类只包含 3 个值,如果是这样的话,复制将与移动一样高效。

&Vector::subtract(foo, bar)

& 有什么用?那是一个错误吗?此外,成员函数未声明为 static,因此语法错误。无论如何,假设 subtract 返回一个拷贝,它将返回一个拷贝并将其作为参数传递给 multiply 函数。

此外,在另一个注释中,Vector* Vector::subtract(const Vector* v, const Vector* u)
会比 Vector* Vector::subtract(const Vector& v, const Vector& u) 更好,当您将参数传递给 subtract 等时,这会使语法更清晰。

所以改变你的代码,它看起来像下面这样:

Vector Vector::subtract(const Vector& v, const Vector& u)
{
return Vector(v.myX - u.myX, v.myY - u.myY, v.myZ - u.myZ);
}

关于c++ - 在 C++ 中返回类的最佳方式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12505563/

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