c++ - 在错误的对象上调用复制构造函数

标签 c++ visual-c++

我目前正在为链表类实现复制构造函数。当我使用另一个链表作为参数创建该类的新实例时,正在为我作为参数传递的对象调用构造函数。这让我感到困惑,难以置信。这是了解主要方法中发生的事情所必需的部分:

int main()
{
   LinkedList ll;
   LinkedList ll2(ll);
}

因此,不是调用 ll2 的复制构造函数,而是调用 ll 的复制构造函数。在尝试将 ll 复制到新的 LinkedList(即 ll2)之前,我已经确认 ll 的大小正确为 3。虽然在复制之后,两者的大小相同,都大于 3,但更奇怪的是,调用的是 ll 的复制构造函数,而不是 ll2 的复制构造函数。因为我使用的是 VC++,所以我已经通过程序来确认这一点。

这是 LinkedList 类的复制构造函数:

LinkedList::LinkedList(const LinkedList & other)        
{
   LLNode *otherCurNode = other.GetFirst();
   if (otherCurNode != NULL)
   {
      front = new LLNode(otherCurNode->GetValue(), NULL, NULL);
      back = front;
   }
   else
   {
      front = NULL;
      back = NULL;
   }
   LLNode *curNode = front;
   while (otherCurNode != NULL)
   {
      Insert(otherCurNode->GetValue(), curNode);
      curNode = curNode->GetNext();
      otherCurNode = otherCurNode->GetNext();
      back = curNode;
   }
   numNodes = other.GetSize();
}   

如果这最终成为一个简单的问题,我深表歉意 - 我是 C++ 的新手。任何帮助将不胜感激!

最佳答案

LinkedList ll = LinkedList();

这将创建一个链表实例,然后复制构造该实例。这看起来像 Java 或 C#-ism。它实际上等同于:

LinkedList ll(LinkedList());

要创建一个空链表,只需写:

LinkedList ll;

这将隐式调用默认构造函数。

此外,请确保您确实有一个默认构造函数,它正确地将链表初始化为空。如果您没有,那么列表的变量将以堆栈中的任何垃圾值结束。

关于c++ - 在错误的对象上调用复制构造函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3809530/

相关文章:

c++ - 包含来自 CUDA 10.0 的 npps.h 时发生链接错误

c++ - 有模板复制构造函数时不生成默认构造函数

c++ - 如何结合 constexpr 和矢量化代码?

c++ - 使用虚函数代替 IF 语句更快?

c++ - Lambda 的 "this"捕获返回垃圾

C++ 需要一些关于 Pig Latin 字符串的建议

c++ - 函数指针中的参数列表

c++ - Android Studio C++ <list> begin()/end() 无匹配函数[可能是 cmake 问题]

c++ - 使用 3d 对象为图形正确设置坐标

visual-studio - 自动创建 Visual C++ 故障转储