You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何无法通过构造函数给变量赋值且取值错误?

问题分析与修复

你的代码存在两个核心问题,导致Node构造函数无法正确赋值、insert方法输出随机值:

1. Node构造函数的自赋值错误

构造函数里的val = val;是自赋值操作——因为参数名和类成员变量名相同,编译器会优先使用局部的参数val,根本没给类的成员变量val赋值。这会导致成员变量始终是未初始化的垃圾值,所以你看到的是随机数或错误数值。

修复方法二选一:

  • 用this->val = val;明确指定给成员变量赋值(this指针指向当前对象的成员)
  • 给构造函数参数换个名字,比如Node(int value),再写val = value;

修复后的Node类:

class Node{
    public:
        int val;
        Node *left;
        Node *right;
        // 修复后的构造函数
        Node(int val){
            this->val = val;
            left = nullptr;
            right = nullptr;
        }
};

2. insert函数中的野指针问题

你在insert函数里创建root = new Node(val);后立刻执行delete root;,直接释放了刚分配的内存,导致root变成野指针。后续访问root->val时,读取的是已经被回收的内存区域,结果必然是随机垃圾值。

修复方法:删除delete root;这行代码,保留动态分配的Node对象作为树的根节点。另外还要给后续的判断加else,避免空指针访问:

修复后的insert函数:

void BST::insert(int val){
    if (root == nullptr){
        root = new Node(val);
        cout << root->val << endl; // 现在会正确输出传入的val
    }
    else if (root->val == val){
        cout<<"The value: " << val << " is duplicated!" << endl;
    }
}

完整修复后的代码

#include<iostream>
using namespace std;

class Node{
    public:
        int val;
        Node *left;
        Node *right;
        Node(int val){
            this->val = val;
            left = nullptr;
            right = nullptr;
        }
};

class BST{
    public:
        Node *root;
        BST(){
            root = nullptr;
        }
        void insert(int val);
};

void BST::insert(int val){
    if (root == nullptr){
        root = new Node(val);
        cout << root->val << endl;
    }
    else if (root->val == val){
        cout<<"The value: " << val << " is duplicated!" << endl;
    }
    // 可补充:插入值比根节点小/大时的子树插入逻辑
}

int main() {
    BST bst;
    Node a = Node(10);
    cout << a.val << endl; // 正确输出10
    bst.insert(8); // 正确输出8
    
    return 0;
}

额外提示

  • 作为C++新手,要注意区分成员变量和函数参数,名字相同时用this->明确指向成员变量是最直接的方法
  • 用new动态分配的内存不要随意delete,除非确定不再使用,否则会引发野指针问题
  • 当前insert函数只处理了根节点的两种情况,还需要补充左子树、右子树的插入逻辑,才能实现完整的BST功能

内容的提问来源于stack exchange,提问作者Cody Gao

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.22 10:52:49