【发布时间】:2015-10-30 00:29:10
【问题描述】:
我正在阅读一份很好的编程实践文档,我发现了这个:
• 返回值的子程序不会使用引用参数,也不会执行任何 I/O 操作。 返回值的子程序不会调用其他使用引用参数或执行 I/O 操作的子程序。
那么,我猜你只能在带有引用的 void 子程序中使用 i/o? 但是人们真的遵循这个规则还是不是很重要?
【问题讨论】:
我正在阅读一份很好的编程实践文档,我发现了这个:
• 返回值的子程序不会使用引用参数,也不会执行任何 I/O 操作。 返回值的子程序不会调用其他使用引用参数或执行 I/O 操作的子程序。
那么,我猜你只能在带有引用的 void 子程序中使用 i/o? 但是人们真的遵循这个规则还是不是很重要?
【问题讨论】:
返回值的子程序不会使用引用参数
我确实在一些指南中看到了它,因为通过引用返回结果会降低程序的可读性。
例如,在下面的示例调用中,您如何知道哪个参数是函数的输入,哪个参数是其输出:
centroid = optimize(data,window);
不过,通过引用返回输出结果通常都是一样的。但是,您必须遵循严格的签名约定,其中输入参数是 const 而输出参数不是:
double optimize(const Data& data, // const ref, means input
Window& window);// non-const ref, means output
有时提出的另一个解决方案是输出参数应该通过指针而不是引用传递。因此,在上面的示例中,您将使用不同的签名,其中 window 通过指针传递:
double optimize(const Data& data, // const ref, means input
Window* window);// pointer, means output
基于此约定,您可以通过检查函数的调用方式来猜测输入和输出,而无需验证函数的签名:
centroid = optimize(data,&window);
返回值的子程序不会 [...] 执行任何 I/O 操作。
在此指南之前我从未遇到过,所以我不知道它的基本原理:-/ 实际上,有许多执行 I/O 的返回值函数,例如输入函数、用户对话框、解析配置文件等等。
【讨论】: