我在 c++ 中为单向链表编写了运算符*。当我编写 main 中包含的函数时,它可以工作,但是当我调用该函数时,它不起作用


Polynomial& Polynomial::operator*(double k) {
Polynomial result;
Node<double>*current = first;
if (!current) {
throw "Can't do this operation with empty polynomial. /n";
}

for (int i = 0; i < length(); i++) {
result.insertAt(i, k*current->info);
current = current->next;
}
return result;
}

//函数insertAt((工作正常。

Polynomial result;

在这个函数中定义了一个名为result的局部变量。与所有其他局部变量一样,当该函数返回时,它将被销毁,并且将不再存在。这就是局部函数变量在C++中的工作方式。

return result;

此函数被声明为返回对对象的引用。此return语句返回对result的引用。然而,由于函数result的返回,它同时被破坏。此函数返回对已销毁对象的引用,使用此引用会导致未定义的行为。这就是你所看到的异常行为的解释。

此函数不应返回引用,而应按值返回对象。希望Polynomial完全符合规则3,并且有一个适当的复制构造函数和一个赋值运算符,以便正确地实现这一点。

附言:大多数现代C++编译器完全能够检测到这个明显的、常见的错误。如果编译器发出诊断消息并警告您,这是一堂永远不要忽视编译器发出的警告消息的课,即使它成功编译了您的程序。编译器希望帮助您编写正确的代码。请始终验证您的程序在编译时是否没有来自C++编译器的任何诊断消息。即使程序编译了,编译器发出的警告消息也会经常指示代码中存在真正的错误。

最新更新