Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 为什么方法应该返回一个新实例,而不是修改实例本身?_C++_Oop - Fatal编程技术网

C++ 为什么方法应该返回一个新实例,而不是修改实例本身?

C++ 为什么方法应该返回一个新实例,而不是修改实例本身?,c++,oop,C++,Oop,假设我有一个Vector3类,它包含一个normalize()方法。如果该方法返回一个新的Vector3,或者修改它被调用的Vector3实例(因此返回对自身的引用(Vector3&)?),其中一个实例比另一个更可取?性能如何 Vector3 rotate(const Angle& angle) 可能还可以,但这取决于向量3是否正确实现。特别是关于std::move()行为。答案取决于类的设计 对于可变类,旋转应旋转向量本身。这在某种程度上被视为更有效,对于大型对象,当向量中有许多项

假设我有一个
Vector3
类,它包含一个
normalize()
方法。如果该方法返回一个新的
Vector3
,或者修改它被调用的
Vector3
实例(因此返回对自身的引用(
Vector3&
)?),其中一个实例比另一个更可取?性能如何

 Vector3 rotate(const Angle& angle)

可能还可以,但这取决于向量3是否正确实现。特别是关于std::move()行为。

答案取决于类的设计

对于可变类,
旋转
应旋转向量本身。这在某种程度上被视为更有效,对于大型对象,当向量中有许多项时,它可以避免复制大量数据

另一方面,不可变类必须只返回新对象,因为它们本身不能进行变异。这增加了一些开销,但也有很多好处,尤其是当对象必须同时使用时

常见的命名约定是使用动词进行变异操作,如

myVector.rotate(angle);
myVector.scale(factor);
而返回新对象的操作应使用命名,如中所示


副作用。例如,如果我传递了一个从地图上检索到的对象,而你对我传递的对象做了一些操作,你就改变了我地图中的东西,下次我请求它时,我会得到一些看起来与上次不一样的东西。保持对象不变可防止此类事故,特别是当多个开发人员在同一个应用程序上工作时。

竞争目标:正确性与性能(有时)

如果您使用不可变类型,那么就更容易编写正确的(并行)程序。如果您使用可变类型,您有时会获得一定的性能优势,一旦您尝试并行,这些优势很可能会丢失。然后是80/20规则。80%的代码不需要优化。那么,为什么默认情况下使用可变类型呢


首先是不可变的,然后看看它是否有足够的性能,如果没有,再进行优化。

您能添加一些代码示例吗?我不知道你到底在说什么,但我相信你可能对阅读竞争目标感兴趣:正确性与性能(有时)。如果您使用不可变类型,那么就更容易编写正确的(并行)程序。如果您使用可变类型,您有时会获得一定的性能优势,一旦您尝试并行,这些优势很可能会丢失。然后是80/20规则。80%的代码不需要优化。那么,为什么默认情况下使用可变类型呢?首先去不可变,然后看看它是否有足够的性能,然后优化,如果没有。@BitTicker回答,不要评论…@BitTicker仅80%?我非常保守的估计是大约95%不需要优化,如果按代码行计算:-)
auto newVector = myVector.rotated(angle).scaled(factor);