10-2 到底应不应该返回对象?
前几讲里我们已经约略地提到了返回对象的问题,本讲里我们进一步展开这个话题,把返回对象这个问题讲深讲透。 F.20 《C++ 核心指南》的 F.20 这一条款是这么说的 [1]: F.20: For “out” output values, prefer return values to output parameters 翻译一下: 在函数输出数值时,尽量使用返回值而非输出参数 这条可能会让一些 C++ 老手感到惊讶——在 C++11 之前的实践里,我们完全是采用相反的做法的啊! 在解释 F.20 之前,我们先来看看我们之前的做法。 调用者负责管理内存,接口负责生成 一种常见的做法是,接口的调用者负责分配一个对象所需的内存并负责其生命周期,接口负责生成或修改该对象。这种做法意味着对象可以默认构造(甚至只是一个结构),代码一般使用错误码而非异常。 示例代码如下: MyObj obj; ec = initialize(&obj); … 这种做法和 C 是兼容的,很多程序员出于惯性也沿用了 C 的这种做法。一种略为 C++ 点的做法是使用引用代替指针,这样在上面的示例中就不需要使用 & 运算符了;但这样只是语法略有区别,本质完全相同。如果对象有合理的析构函数的话,那这种做法的主要问题是啰嗦、难于组合。你需要写更多的代码行,使用更多的中间变量,也就更容易犯错误。 假如我们已有矩阵变量 A、B 和 C,要执行一个操作 R=A×B+C 那在这种做法下代码大概会写成: error_code_t add(matrix* result, const matrix& lhs, const matrix& rhs); error_code_t multiply(matrix* result, const matrix& lhs, const matrix& rhs); error_code_t ec; matrix temp; ec = multiply(&temp, a, b); if (ec !...