我是否需要使用参考参数来返回值?

时间:2009-04-07 02:31:00

标签: c++ winapi api

如果HANDLE是输出参数,是否需要使用对HANDLE或的引用 直接使用HANDLE?

bool fn(HANDLE h_result);

bool fn(HANDLE& h_result);

4 个答案:

答案 0 :(得分:11)

要返回值,您可以:

  1. 使用引用作为参数
  2. 使用指针作为参数
  3. 实际上通过return
  4. 返回值

    指定以下内容时:

    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)”在处理时会非常繁重,因为有很多对复制构造函数的调用