请帮助我理解链表c++中的运算符重载=

Please help me understand operator overloading = in linked list c++

本文关键字:运算符 重载 c++ 链表 帮助      更新时间:2023-10-16

我有一个这样的结构-

struct IntNode
{
    int data;                   
    IntNode * next;         
};

和在类-

    class NodeSLList {
    private:``
        IntNode *head, *tail;
//some other functions
    }

我有一个对象list1,它包含具有几个节点的链表。我必须从list1创建另一个链表list2。我如何使用功能实现这一点

NodeSLList & operator=(NodeSLList &list){}

我无法理解如何在操作员=函数中访问list2,因为我将在类似-的内部传递list1

list2=list1; 

如何访问list2??

请记住,this指针指向您正在操作的现有类,因此,this->head或简称head是您要更改的旧列表的成员,而newList.head是您必须分配的新列表的成员。

NodeSLList & operator=(NodeSLList &newList)
{
        //Check if there is something to free?
        if(head != NULL) //this->head != NULL
        {                    
                //free head
        } 
        //Assign new one
        head = newList.head; //this->head = newList.head;
        //Other stuff if any
        return this;
}

this将是指向左操作数的指针,在您的情况下是list2。要获取list2本身,只需使用解引用运算符*对其进行解引用即可。即*this

答案是*this

不管怎样。请不要实现自己的链表。已经有了std::list,或者如果您需要一个双链表std::deque。要使代码达到与标准库一样高的质量,您需要付出很多努力,更不用说定义一个同样经过深思熟虑的接口了。

所以,如果这是你的学校的四个,写下你自己的链接列表。我们都这么做了。这是练习使用指针编程的好方法。但是,请抵制在以后的生产代码中进行类似操作的诱惑。我经常看到它,大多数时候它都很慢,效率很低,而且经常很bug。

函数(运算符)NodeSLList & operator=(NodeSLList &list)称为复制赋值运算符。它不创建新对象,而是指定给它们。所以对于你的第一个问题

我必须从列表1创建另一个链表列表2。我该怎么做使用函数…实现这一点。。。

答案是;你没有。首先创建一个新对象list2,然后可以为其赋值

NodeSLList list2;
list2 = list1;

所以实际上list2 = list1;是的简写

list2.operator=(list1);

也许这更清楚地表明,函数operator=是在现有对象上使用的,正如所有其他答案所指出的,您可以通过*this访问该对象。

顺便说一句,如果你写NodeSLList list2 = list1;,你会调用复制构造函数,这是另一回事。。。