【发布时间】:2009-11-23 01:28:26
【问题描述】:
我遇到了这个。
根据样式指南,只允许 const 引用作为参数。 (我是这么理解的)
不过,我似乎不喜欢这种方法。
评论?
【问题讨论】:
标签: c++ pass-by-reference
我遇到了这个。
根据样式指南,只允许 const 引用作为参数。 (我是这么理解的)
不过,我似乎不喜欢这种方法。
评论?
【问题讨论】:
标签: c++ pass-by-reference
以下是一些经验法则,在您做出选择时可能会很有用:
如果您不需要修改传递给函数的对象,请考虑对象的大小是否小于或等于指针的大小。如果是,则按值传递;否则,通过 const 引用传递。
如果您确实需要修改传递给函数的对象,请考虑参数是否可选(即 null 是有效参数)。如果是,则通过指针传递;否则,通过非常量引用传递。
【讨论】:
Google 建议只使用 const 引用,因为他们认为在函数可能修改对象时传递指针更清晰。这可能是真的,但我更喜欢只在 null 是可接受的值时使用指针。
为了澄清,这里有一个解释他们论点根源的例子。
Car c;
foo(c);
函数是否修改 c 完全取决于它是如何声明的,仅查看调用本身并不能说明可能发生的情况。
void foo(Car c);
void foo(const Car &c); OR
void foo(Car &c);
现在考虑
Car c;
foo(&c);
传递了对象的地址后,就更容易(从调用者的角度)查看函数是否会更改您的对象。当然,它不能保证它可以是指向 const 对象的指针,但从代码审查者的角度来看,更容易检测到该对象可能会在函数被传递一个指针时被更改。当严格执行 Google 的建议时,通过指针传递的对象将始终是可变的,而任何不通过指针传递的对象都将是 const。 (通过 const & 或 b/c 值传递)
这是否更好是值得商榷的。我会决定你的感受并在你的团队中保持一致。
【讨论】:
init方法……我有时想知道他们是用C还是C++编程
它也让你可以做到
void x(const std::string& x)
x("你好");
没有 const 它将无法工作。
【讨论】:
这是一种偏好,我可以说这是一种偏好:
void align_left();
// vs.
void alignLeft();
既然你想通过非 const 引用传递参数,那么就这样做吧。我不喜欢传递指针。该约定通常具有其他含义(即许多程序员看到一个指针并认为可能不需要该参数,然后不得不去检查文档)。因此,按照惯例,您通常会使参数名称表明它会改变参数。
t_result getDate(t_string& outString) const;
然后名称表示突变。如果您在代码库中很少通过 ref,这可能有点欺骗性,但它最终是“好的”并且具有足够的积极意义。关于风格,很多都回到了一致性。随着程序的真正扩展,(IMO)这真的很有帮助 - 只需确保程序的意图清晰且样式一致(至少您在编写庞大的代码库之前需要阅读样式文档)。
【讨论】:
const 很容易看到(或看不到)。