gpt4 book ai didi

c++ - 就地修改并返回拷贝是否有意义?

转载 作者:IT老高 更新时间:2023-10-28 23:01:56 26 4
gpt4 key购买 nike

注意:我标记了这个 Python 和 C++,因为我已经看到了这两个例子,但问题是与语言无关的。

修改对象的函数或类方法有两种选择:直接修改相关对象中的数据,或者创建一个新拷贝并返回它,同时保持原始数据不变。通常,您可以通过查看函数返回的内容来判断哪个是哪个。

有时您会发现一个函数会尝试同时执行这两种操作,即修改原始对象,然后返回对该对象的拷贝或引用。有没有一种情况比只做一个或另一个更有优势?

我看过 Fluent Interface 的例子或 Method Chaining这依赖于返回对对象的引用,但这似乎是一种特殊情况,在上下文中应该是显而易见的。

我的第一个坏例子直接来自 Python documentation并说明了可变默认参数的问题。对我来说,这个例子是不切实际的:如果函数修改了它的参数,那么有一个默认值是没有意义的,如果它返回一个拷贝,那么应该在任何修改发生之前进行拷贝。问题的存在只是因为它试图两者兼而有之。

def f(a, L=[]):
L.append(a)
return L

第二个例子来自 Microsoft C++ 中的 CStringT::MakeUpper功能。文档说明了返回值:

Returns a copy of the string but in all uppercase characters.

这导致人们期望原件保持不变。部分问题在于文档具有误导性,如果您查看原型(prototype),您会发现它返回了对字符串的 reference。除非仔细观察,否则您不会注意到这一点,并且将结果分配给新字符串编译不会出错。惊喜在后面。

最佳答案

C++ 示例 Inc/Dec 运算符

// Pre-Increment: Create a new object for return and modify self.
myiterator operator++(int) {myiterator tmp(*this); operator++(); return tmp;}


// Post-Increment: modify self and return a reference
myiterator& operator++() {/* Do Stuff*/ return *this;}

关于c++ - 就地修改并返回拷贝是否有意义?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12809496/

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