请帮助我理解链表c++中的运算符重载=
Please help me understand operator overloading = in linked list c++
我有一个这样的结构-
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;
,你会调用复制构造函数,这是另一回事。。。
- 使用C++中的模板和运算符重载执行矩阵运算
- 为什么这个运算符<重载函数对 STL 算法不可见?
- <T> 通过模板化运算符重载将 std::complex 乘以双倍
- C++20概念:需要运算符重载
- 使用赋值运算符重载从类中返回jobject
- 在运算符重载定义中使用成员函数(const错误)
- 字节到位运算符重载C++
- 为什么在运算符重载时需要参考?
- 类中 c++ 的运算符 + 重载
- 算术复合运算符重载为非成员
- 运算符重载 (+),用于添加两个具有 C++ 的数组
- 交换运算符 + 重载会导致无限递归
- 如何理解新的运算符重载?
- 向量保持复数的运算符重载
- 如何创建运算符重载?
- 链接列表运算符重载没有打印出我想要的内容
- C++:需要帮助了解运算符重载错误
- 使用模板化运算符重载 XOR 运算符失败
- 如何确保接受的C++模板类型使运算符重载?
- 运算符重载使用运算符+添加类模板