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

C++ Student类默认构造对象get_year返回值异常问题

问题根因

你没有为Student类定义自定义构造函数,创建实例s2时调用的是编译器自动生成的默认构造函数:编译器生成的默认构造函数不会对枚举、基础内置类型的成员变量做初始化,这类成员会直接占用内存里残留的随机垃圾值,属于未定义行为。
另外你存在一个认知误区:set_year等方法的参数默认值,只有在你主动调用该方法、且不传入对应参数时才会生效,不会在对象创建阶段自动给成员变量赋值。
你当前代码里,创建完s2后只主动调用了setname和set_ID给姓名、学号赋值:

  • Name、Department是std::string类类型成员,编译器会自动调用string的默认构造将其初始化为空字符串,所以输出符合预期
  • idNumber被你主动调用set_ID赋了值,输出正常
  • 唯独Year是枚举类型,你既没有在构造阶段给它初始值,也没有主动调用set_year(),所以返回的是内存里残留的随机值,刚好等于枚举值JUNIOR对应的2,和你预期的0不符。
修复方案

二选一即可,更推荐第二种从根源规避未初始化问题。

方案1:补全遗漏的set方法调用

创建对象后主动调用没执行的set方法,不传参就会自动使用你预设的默认参数:

int main()
{
    Student s2;
    s2.setname("Nikolai", "Khabeboolin");
    s2.set_ID(12436193);
    // 补上这两个初始化调用
    s2.set_year();
    s2.set_Department();

    cout<<"ID is: "<< s2.get_ID()<<", name is "<< s2.get_name()<<", year in school is: "<<s2.get_year()<<", Department is "<<s2.get_Department()<<endl;
    return 0;
}

方案2:为Student类定义自定义默认构造函数

在构造函数里统一给所有成员设置默认初始值,不需要每次创建对象都手动调用多个set方法做初始化:

class Student: name{
    private:
        name Name;
        year Year;
        int idNumber;
        string Department;
    public:
        // 自定义默认构造函数,统一初始化所有成员
        Student()
        {
            Name.firstName = "";
            Name.lastName = "";
            Year = FRESHMAN;
            idNumber = 0;
            Department = "";
        }
        // 原有set、get方法保持不变即可
        void setname(string fn="", string ln="")
        {
            Name.firstName =fn;
            Name.lastName =ln;
        }
        name get_name()
        {
            return Name;
        }
        void set_year(year yr=FRESHMAN)
        {
            Year=yr;
        }
        year get_year()
        {
            return Year;
        }
        void set_ID(int ID=0)
        {
            idNumber=ID;
        }
        int get_ID()
        {
            return idNumber;
        }
        void set_Department(string Dept="")
        {
            Department=Dept;
        }
        string get_Department()
        {
            return Department;
        }
};

如果使用C++11及以上更新的标准,还可以直接在成员声明位置指定默认初始值,写法更简洁:

class Student: name{
    private:
        // 直接在声明时给成员设默认值
        name Name{"", ""};
        year Year{FRESHMAN};
        int idNumber{0};
        string Department{""};
    // 其余set、get方法保持不变
};

额外提示:你当前代码里class Student: name是私有继承name结构体,因为class默认继承权限是private,虽然当前代码没触发问题,但如果后续需要把Student实例转换为name类型使用,记得显式声明为public继承。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.28 02:57:07