我们应该在通过引用传递之前取消引用指针吗?

时间:2016-05-07 13:49:27

标签: c++ pointers reference

多年前,我从C ++课程的老师那里学到了东西。他展示了如何在C ++中使用指针和链表: [语法不正确]

//Declaration
Nodetype *head = new NodeType()...

//Call insertnode method: 
InsertNode(head, val1);

//The InsertNode function
void InsertNode(NodeType& head, int val1){}

如上所述,我们没有取消引用“head”。 我们使用“InsertNode(head,val1);”而不是“InsertNode(* head,val1);”

然而昨天,当我从微软网站学习智能指针时: 他们使用“ProcessLargeObject(* pLarge);”而不是“ProcessLargeObject(pLarge);”。

我们应该在通过引用传递之前取消引用指针吗?或者我们应该只通过指针而不进行derefencing? 请指教

class LargeObject
{
public:
    void DoSomething(){}
};

void ProcessLargeObject(const LargeObject& lo){}
void SmartPointerDemo()
{    
    // Create the object and pass it to a smart pointer
    std::unique_ptr<LargeObject> pLarge(new LargeObject());

    //Call a method on the object
    pLarge->DoSomething();

    // Pass a reference to a method.
    ProcessLargeObject(*pLarge);

} //pLarge is deleted automatically when function block goes out of scope

2 个答案:

答案 0 :(得分:4)

  

如上所述,我们没有取消引用“head”。我们使用“InsertNode(head,val1);”而不是“InsertNode(* head,val1);”

这是一个错误,所以你的问题的前提被打破了。你必须错误记录,或者这可能是你课程材料中的错字。或者,也许,你的教授错了。

取消引用head,因为InsertNode接受NodeType(通过引用),而不是NodeType*

一般来说,我可以说你将如何使用链表完全取决于实现。在C ++中实现链表类型没有“单向”。您必须阅读所用课程的文档,以了解如何正确使用它。

FWIW,在实际的生产代码中,您通常会使用std::list并完成它。

答案 1 :(得分:2)

这可能是教练的一个错字。如果,如您提供的示例

void InsertNode(NodeType& head, int val1){}

签名有一个引用参数,然后传入一个指针

NodeType *p = new NodeType;
InsertNode (p, 1);   // error

格式不正确,甚至不应该编译。允许指针会违反C ++的强类型性质。如果您有一个指向要传递给此类函数的对象的指针,则必须取消引用指针。

InsertNode (*p, 1); // correct