Mar*_*som 13 c++ python mutable
注意:我正在标记这个Python和C++,因为我已经看到了两者中的例子,但问题是语言无关.
修改对象的函数或类方法有两种选择:直接在相关对象中修改数据,或创建新副本并在保持原始状态不变的情况下返回它.通常,您可以通过查看函数返回的内容来判断哪个是哪个.
有时,您会找到一个尝试同时执行这两项操作的函数,修改原始对象,然后返回该对象的副本或引用.有没有一种情况比只做一个或另一个提供任何优势?
我已经看到了Fluent Interface或Method Chaining的例子,它依赖于返回对象的引用,但这似乎是一个在上下文中应该很明显的特殊情况.
我的第一个坏例子直接来自Python文档,并说明了可变默认参数的问题.对我来说,这个例子是不现实的:如果函数修改了它的参数,那么有一个默认值是没有意义的,如果它返回一个副本,那么应该在进行任何修改之前进行复制.这个问题只存在,因为它试图同时做到这两点.
def f(a, L=[]):
L.append(a)
return L
Run Code Online (Sandbox Code Playgroud)
第二个例子来自CStringT::MakeUpper函数中的Microsoft C++ .文档说明了返回值:
返回字符串的副本,但全部为大写字符.
这导致人们期望原件保持不变.问题的一部分是文档有误导性,如果你看原型,你会发现它正在返回对字符串的引用.除非仔细观察,否则您不会注意到这一点,并将结果分配给新字符串进行编译而没有错误.后来出人意料.
C++ 中有一些明显的示例,您可以在其中修改对象并返回引用:
任务:
T & T::operator=(T && rhs)
{
ptr = rhs.ptr;
rhs.ptr = nullptr;
return *this;
}
Run Code Online (Sandbox Code Playgroud)
这个修改对象本身和参数,并返回对其自身的引用。这样就可以写了a = b = c;。
IO 流:
std::ostream & operator<<(std::ostream & os, T const & t)
{
os << t->ptr;
return os;
}
Run Code Online (Sandbox Code Playgroud)
同样,这允许操作链接,std::cout << t1 << t2 << t3;或典型的“提取和检查” if (std::cin >> n) { /* ... */ }。
基本上,返回对输入对象之一的引用始终用于链调用或以某种形式评估结果状态,并且有几种有用的场景。
另一方面,修改参数然后返回对象的副本似乎不太有用。
| 归档时间: |
|
| 查看次数: |
366 次 |
| 最近记录: |