代码之家  ›  专栏  ›  技术社区  ›  Ignas Limanauskas

参数定义(type&name)和(type*name)之间有什么区别?

  •  5
  • Ignas Limanauskas  · 技术社区  · 16 年前

    在C++中,有两种非常相似的通过引用声明参数的方法。

    1) 使用“星号”:

    void DoOne(std::wstring* iData);
    

    2) 使用“与”:

    void DoTwo(std::wstring& iData);
    

    每种方法的含义是什么?

    额外好处2:std::wstring是故意使用的。在每种情况下,对标准库类有什么影响?

    7 回复  |  直到 16 年前
        1
  •  7
  •   James Hopkin    16 年前

    std::wstring s;
    
    DoOne(&s); // pass a pointer to s
    DoTwo(s); // pass s by reference
    

    const 指针或引用。临时变量只能传递给const引用参数:

    void ByConstPointer(const std::wstring&);
    void ByConstReference(const std::wstring*);
    
    void test()
    {
      ByConstPointer(&std::wstring(L"Hello")); // error: cannot take address of temporary
      ByConstReference(std::wstring(L"Hello")); // fine
    }
    
        2
  •  2
  •   Johann Gerell    16 年前

    第一条规则:如果NULL是函数上下文中函数参数的有效值,则将其作为指针传递,否则将其作为引用传递。

        3
  •  1
  •   Ignas Limanauskas    16 年前

    在写例子的时候,我想出了自己的答案。除了下面还有别的吗?

    {
        std::wstring data;
        DoOne(&data);
        DoTwo(data);
    }
    

    然而,当涉及到堆时,第二种方法要求对象在调用方法之前必须存在。如果对象不存在,则调用者将导致异常,而不是被调用者。

    {
        std::wstring* pData = new std::wstring();
        DoOne(pData);
        DoTwo(*pData);
    }
    

        4
  •  0
  •   Viktor Sehr    16 年前

    我不会称自己为C++程序员(简历上除外),但我会说;除非将参数作为指针传递有任何用途(即函数想要检查null),否则请始终使用引用。

    这也适用于返回对象的函数,返回指针以某种方式告诉类的用户它可能是null。

        5
  •  0
  •   Amol Gawai    16 年前

    有点像

    void DoOne(std::wstring* iData)
    {
       //Use iData
       delete iData;
       iData = NULL;
    }
    

    {
        std::wstring* pData = new std::wstring();
        DoOne(pData);
        pData->someFunction(); //Crash
    }
    
        6
  •  0
  •   2 revs<br/>anon&#13;    16 年前

    他们每个人的结果都很好 相似:对某个对象的引用 内存最终位于方法的内部

    联系人:

    void f( int * p1 ) {
       int ** p2 = & p1;
    }
    

    这里p1有一个明确的“内存要求”——它必须存在,我必须能够获取它的地址。对比一下

    void f( int & r ) }
       int * p = & r;
    }
    

    这里r没有自己的存在,它只是一个参考。我什么时候拿它 地址我取r所指事物的地址。

        7
  •  0
  •   Eugene Bujak    16 年前