【问题标题】:Do I need to use reference parameters for returning values?我需要使用参考参数来返回值吗?
【发布时间】:2010-10-17 23:04:40
【问题描述】:

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

bool fn(HANDLE h_result);

bool fn(HANDLE& h_result);

【问题讨论】:

    标签: c++ winapi api


    【解决方案1】:

    要返回值,您可以:

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

    当您指定以下内容时:

    bool fn(HANDLE h_result);
    

    您正在制作 h_result 的副本。所以如果你在你的函数中改变它,你改变的是副本,而不是原来的。

    在处理指针时,概念是完全一样的。请记住,指针只是一个保存内存地址的变量。该内存地址中的内容无关紧要。如果要通过参数返回内存地址,则需要使用指向指针或指针引用的指针。

    【讨论】:

      【解决方案2】:

      如果您直接使用“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)”处理起来会很繁重,因为对复制构造函数有很多调用

      【讨论】:

        【解决方案3】:

        在你的情况下,我宁愿做这样的事情:

        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是一个输出参数,由于代码可读性可能会出现一些细微的问题。

        总之,我建议尽量避免输出参数,因为代码可读性,但是,如果你真的别无选择,使用引用而不是指针,如果输出参数是强制性的。

        【讨论】:

          【解决方案4】:

          HANDLE 基本上是一个 void*,仅此而已。将有问题的代码更改为

          bool fn(void* pResult);
          

          答案会更清楚。如果您希望分配给 pResult 的值可供调用 fn 的人使用,您必须将函数更改为

          bool fn(void*& pResult);
          

          相当于

          bool fn(HANDLE& h_result);
          

          【讨论】:

          • 恕我直言,您不应该看到 HANDLE 是如何真正定义的。只需按照文档进行操作 - 所有接口都得到了很好的描述。如果定义您自己的函数 - 使用常识:类型 T 的输出参数是 C 中的 T* 和 C++ 中的 T&。在这种情况下 T == HANDLE
          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-12-12
          • 2017-10-05
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多