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
相关产品推荐
相关产品推荐

