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

CRe*_*ice 3 c++ oop

假设我有一个Vector3包含normalize()方法的类.该方法是否应该返回一个新的Vector3,或者修改Vector3它被调用的实例(因此返回对self(Vector3&)的引用?)有哪些实例优先于另一个?性能怎么样?

das*_*ght 5

答案取决于你班级的设计.

对于可变类,rotate应该旋转向量本身.这被认为更有效,并且在大对象的情况下,它允许您避免在向量中包含许多项目时复制大量数据.

另一方面,不可变类必须只返回新对象,因为它们不能自己变异.这增加了一些开销,但它有很多优点,特别是当必须同时使用对象时.

常见的命名约定是使用动词来改变操作,如

myVector.rotate(angle);
myVector.scale(factor);
Run Code Online (Sandbox Code Playgroud)

返回新对象的操作应使用过去分词命名,如

auto newVector = myVector.rotated(angle).scaled(factor);
Run Code Online (Sandbox Code Playgroud)