- 论坛徽章:
- 2
|
回复 #75 w_anthony 的帖子
再换一个角度吧……
比如就是string.replace。 既可以提供返回值的, 也可以提供在一个对象上修改的版本。
(不写模板了, 实际上是个模板)
class string {
public:
string replace( ... );
static void replace( string& s, ... );
};
那么, 想替换, 并且得到一个新的string, 就可以调用返回值的。
想在既有对象上修改的, 就可以调用传入引用的。
这是2种不同的功能。
当需要一个新对象时 —— 而不管某个特定的函数该如何设计了, 而是从用户的需要来说 —— 返回值可能就会比绕弯去使用引用要快。
当需要在原对象上修改时, 那肯定不能设计为返回值。
"另外如果是DLL导出函数,还是要用1方式,毕竟不同的编译器行为不确定,用2的话MinGW的dll给VC调用就可能会出问题。"
这不是"应该返回值时将其改为创建然后修改"的理由。
这是设计的另一个方面了 —— 是否需要隐藏对象的表示。
如果确实需要, 是不可以创建对象的值, 而只能使用引用的。
这么说吧, 前面一个设计, 可以通过一个问题来得到答案 "你需要获得一个新对象吗?"
如果是, 就返回值; 否则就采用参数。
后面一个设计, 也可以通过一个问题来得到答案 "你要限制按值语意使用对象吗?"
如果是, 连直接创建对象都不可以, 只能通过引用或者指针来创建, 使用, 销毁对象。
在这种情况下, 讨论前一个问题就是无意义的了 —— 本来就不存在(或者不可见)对象的值, 只有引用或指针。 |
|