多年前,我从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
答案 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