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

And*_*ect 2 c++ visual-c++

我目前正在为Linked List类实现一个拷贝构造函数.当我使用另一个链接列表作为参数创建类的新实例时,正在为我作为参数传递的对象调用构造函数.这让我感到困惑,无法相信.以下是了解主方法中发生的事情所需的部分:

int main()
{
   LinkedList ll;
   LinkedList ll2(ll);
}
Run Code Online (Sandbox Code Playgroud)

因此,不是为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();
}   
Run Code Online (Sandbox Code Playgroud)

如果这最终成为一个简单的问题我很抱歉 - 我对C++很新.任何帮助将不胜感激!

Joh*_*ica 7

LinkedList ll = LinkedList();
Run Code Online (Sandbox Code Playgroud)

这将创建一个链接列表实例,然后复制构造此实例.这看起来像Java或C#-ism.它实际上相当于:

LinkedList ll(LinkedList());
Run Code Online (Sandbox Code Playgroud)

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

LinkedList ll;
Run Code Online (Sandbox Code Playgroud)

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

此外,请确保您具有默认构造函数,该构造函数正确初始化链表以清空.如果你没有,那么列表的变量将以堆栈中的任何垃圾值结束.

  • 不,不要添加括号来显式调用构造函数.对于不带参数的构造函数,它将被解释为函数声明. (5认同)