C++ 返回值的子程序不应执行i/o?
我在阅读一篇优秀编程实践文档时发现: •返回值子程序不会使用参考参数,也不会执行任何I/O操作。 返回值的子程序不会调用使用引用参数或执行I/O操作的其他子程序 所以,我想您只能在带有引用的void子程序中使用I/o? 但人们真的遵守这条规则吗?还是这条规则并不重要 返回值的子程序将不使用引用参数 我确实在一些指南中看到了这一点,因为通过引用返回结果会降低程序的可读性 例如,在下面的示例调用中,如何知道哪个参数是函数的输入,哪个参数是函数的输出:C++ 返回值的子程序不应执行i/o?,c++,io,reference,void,C++,Io,Reference,Void,我在阅读一篇优秀编程实践文档时发现: •返回值子程序不会使用参考参数,也不会执行任何I/O操作。 返回值的子程序不会调用使用引用参数或执行I/O操作的其他子程序 所以,我想您只能在带有引用的void子程序中使用I/o? 但人们真的遵守这条规则吗?还是这条规则并不重要 返回值的子程序将不使用引用参数 我确实在一些指南中看到了这一点,因为通过引用返回结果会降低程序的可读性 例如,在下面的示例调用中,如何知道哪个参数是函数的输入,哪个参数是函数的输出: centroid = optimize(data
centroid = optimize(data,window);
尽管如此,通过引用返回输出结果通常都是一样的。但是,您必须遵循严格的签名约定,其中输入参数为const
,而输出参数不是:
double optimize(const Data& data, // const ref, means input
Window& window);// non-const ref, means output
有时提出的另一种解决方案是,输出参数应该通过指针而不是引用传递。因此,在上面的示例中,您将使用不同的签名,其中窗口
通过指针传递:
double optimize(const Data& data, // const ref, means input
Window* window);// pointer, means output
基于此约定,您可以通过检查函数的调用方式来猜测输入和输出,而无需验证函数的签名:
centroid = optimize(data,&window);
返回值的子程序将不会[…]执行任何I/O操作
在此之前,我从未遇到过此指南,因此我不知道其原理:-/实际上,有许多执行I/O的值返回函数,例如输入函数、用户对话框、解析配置文件等