【发布时间】:2010-10-17 23:04:40
【问题描述】:
如果 HANDLE 是输出参数,是否有必要使用对 HANDLE 的引用或 直接使用HANDLE?
bool fn(HANDLE h_result);
或
bool fn(HANDLE& h_result);
【问题讨论】:
如果 HANDLE 是输出参数,是否有必要使用对 HANDLE 的引用或 直接使用HANDLE?
bool fn(HANDLE h_result);
或
bool fn(HANDLE& h_result);
【问题讨论】:
要返回值,您可以:
return返回值
当您指定以下内容时:
bool fn(HANDLE h_result);
您正在制作 h_result 的副本。所以如果你在你的函数中改变它,你改变的是副本,而不是原来的。
在处理指针时,概念是完全一样的。请记住,指针只是一个保存内存地址的变量。该内存地址中的内容无关紧要。如果要通过参数返回内存地址,则需要使用指向指针或指针引用的指针。
【讨论】:
如果您直接使用“HANDLE”,您在函数调用中所做的任何更改都不会传递给调用者处的对象。
例如对于“bool fn(HANDLE h_result);”
HANDLE oH = CreateHandle(); // Some function
oH.SetName("Sam");
bool bRet = fn(oH); // Assume we call oH.SetName("Max");
cout << oH.GetName() << endl; //will print "Sam"
但是如果你使用“bool fn(HANDLE&h_result);”输出将是“最大”
所以选择取决于应用程序。如果您需要维护在“fn”中所做的状态更改,请将参数作为引用传递。如果没有,请使用“bool fn(HANDLE h_result);”传递一个副本
附: “bool fn(HANDLE h_result)”处理起来会很繁重,因为对复制构造函数有很多调用
【讨论】:
在你的情况下,我宁愿做这样的事情:
HANDLE fn()
如果失败则返回无效(或 NULL)句柄,否则返回有效句柄。当然,我假设 HANDLE 类型在某种程度上类似于 Win32 API 用作句柄的类型。
至于你的问题,通过引用或指针传递输出参数,所以:
bool fn( HANDLE& out)
或
bool fn( HANDLE* out)
在第二个示例中,您应该确保传递的指针不为 NULL,通常带有断言:
bool fn( HANDLE* out)
{
assert( NULL != out);
// ... rest of the code
}
将输出参数作为指针传递的另一个缺点是您无法确定传递的指针是否有效(是否已初始化)。
当涉及到输出参数时,通过引用传递有时可读性较差。调用
bool 结果 = fn(myHandle);
并没有给开发者提示myHandle是一个输出参数,由于代码可读性可能会出现一些细微的问题。
总之,我建议尽量避免输出参数,因为代码可读性,但是,如果你真的别无选择,使用引用而不是指针,如果输出参数是强制性的。
【讨论】:
HANDLE 基本上是一个 void*,仅此而已。将有问题的代码更改为
bool fn(void* pResult);
答案会更清楚。如果您希望分配给 pResult 的值可供调用 fn 的人使用,您必须将函数更改为
bool fn(void*& pResult);
相当于
bool fn(HANDLE& h_result);
【讨论】: