传递给对象的成员函数的行为会发生变化吗?

时间:2018-08-23 06:45:16

标签: 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的原型定义为void mergeList()而不是void mergeList(LinkedList l2),那么它可以正常工作。当我将链接列表传递给函数时,为什么会发生这种情况?

1 个答案:

答案 0 :(得分:5)

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

这里要存储mynode的地址,它是append中的局部变量(它是一个函数参数)。到append返回时,其局部变量已被破坏(包括mynode),所以现在您的head指向一个不再存在的变量。

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