如果HANDLE是输出参数,是否需要使用对HANDLE或的引用 直接使用HANDLE?
bool fn(HANDLE h_result);
或
bool fn(HANDLE& h_result);
答案 0 :(得分:11)
要返回值,您可以:
return
指定以下内容时:
bool fn(HANDLE h_result);
您正在复制h_result。因此,如果您在功能中更改它,则表示您正在更改副本,而不是原始副本。
在处理指针时,概念完全相同。请记住,指针只是一个包含内存地址的变量。这个内存地址是什么并不重要。如果要通过参数返回内存地址,则需要使用指向指针或指针引用的指针。
答案 1 :(得分:1)
在你的情况下,我宁愿做类似的事情:
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 result = fn(myHandle);
没有向开发人员提示myHandle是输出参数,并且由于代码可读性可能会出现一些细微的问题。
总之,我建议尽可能避免输出参数,因为代码可读性,但是,如果你真的别无选择,请使用引用而不是指针,如果输出参数是必需的。
答案 2 :(得分:1)
HANDLE基本上是一个空洞*,就是这样。将相关代码更改为
bool fn(void* pResult);
答案会更清晰。如果您希望分配给pResult的值可供调用fn的用户使用,则必须将该函数更改为
bool fn(void*& pResult);
相当于
bool fn(HANDLE& h_result);
答案 3 :(得分:0)
如果您直接使用“HANDLE”,则您在函数调用中所做的任何更改都不会传递给调用者的对象。
e.g。对于“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&amp; h_result);”输出将是“Max”
所以选择取决于应用程序。如果需要维护“fn”中的状态更改,请将参数作为参考传递。如果没有,请使用“bool fn(HANDLE h_result);”
传递副本P.S。 “bool fn(HANDLE h_result)”在处理时会非常繁重,因为有很多对复制构造函数的调用