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++ 中打开一个数字大于 9 的 COM 端口

java - 让父类(super class)使用子类使用的枚举

C++ 类重载 : is it possible to make compiler see which one to use based on template?

c++ - 使用两个线程计算斐波那契数列。

c++ - qdbusxml2cpp 未知类型

python - 如何在Python中将postgres表列指定为变量?

c# - 如何创建一个有条件定义类型的对象?

python - Python 中的多重继承和构造函数

c++ - 在 std::for_each 中传递 vector 位置

c++ - 没有得到数字基础检查器的正确解决方案