c++ - 当一个对象被传递给它时,成员函数的行为会改变吗?

标签 c++ class

我在使用类实现链表时,发现了一些我无法解释的东西。这是代码:

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

class LinkedList{
    public:
        int msize = 0;
        Node *head;
        Node *tail;
        void append(Node mynode){
            if(msize == 0){
                head = &mynode;
                tail = &mynode;
                msize++;
            }
            else{
                (*tail).next = &mynode;
                tail = &mynode;
                msize++;
            }
        }
        void mergeList(LinkedList l2){
            cout << (*head).data;
        }
   };

我面临的问题是 mergeList 函数,它采用另一个链表作为输入。现在,这是主函数中的代码:

int main(){
    LinkedList l1;
    LinkedList l2;

    Node n1 , n2;
    n1.data = 132;
    n2.data = 123;

    l1.append(n1);
    l2.append(n2);

    l1.mergeList(l2);
    return 0;
}

问题来了:在函数mergeList中,输出的值为1,而应该是132,因为n1是链表的头节点l1。如果我将 mergeList 的原型(prototype)定义为 void mergeList() 而不是 void mergeList(LinkedList l2),那么它可以正常工作。当我将链表传递给函数时,为什么会发生这种情况?

最佳答案

    void append(Node mynode){
        if(msize == 0){
            head = &mynode;

这里存储了 mynode 的地址,它是 append 中的一个局部变量(它是一个函数参数)。当 append 返回时,它的局部变量被销毁(包括 mynode),所以现在你的 head 指向一个不再存在的变量。

稍后尝试使用 head 会导致未定义的行为。

关于c++ - 当一个对象被传递给它时,成员函数的行为会改变吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51979801/

相关文章:

c++ - 是否有 C++ 等效于 Java 的 STL 容器类的 Collection 接口(interface)?

php - 列出给定类的所有方法,不包括 PHP 中父类的方法

python - 如何按定义顺序获取类变量列表?

Javascript - 如果语句不起作用?

c++ - 基于模板类型的类类型

c++ - 根据您的 .h 或 .hpp 文件中的代码,人们可以从您的应用程序中了解到什么?

c++ - 不推荐使用 char 的字符串文字

c++ - 在调试过程中如何查看 Qt 对象 QByteArray 的内容?

java - 什么需要更多内存 - 嵌套类/单独类

c++ - 继承类模板的参数化构造函数