我的C++类构造函数、Getter方法及对象数组存在什么问题?
问题根源
你所有的构造函数和setter方法里都犯了同一个错误:重新定义了和类成员变量同名的局部变量,导致你实际是给局部变量赋值,而类的私有成员变量根本没被初始化或修改,始终处于未定义的垃圾状态,所以get方法返回的都是无意义的垃圾值。
比如你的带参构造函数里:
CCourse(string course101, double avg, unsigned int MaxE) { string name = course101; // 这里创建了局部变量name,不是给类成员name赋值 double average = avg; unsigned int maxEnrollment = MaxE; }
这里的string name是局部变量,和类里的private: string name;是两个完全不同的变量,局部变量在构造函数执行完就销毁了,类成员name还是默认初始化的空字符串(string还好,double和unsigned int会是随机垃圾值)。
setter方法里也是一样的问题,比如setCourseName里的string name = course101;也是创建局部变量,根本没改类成员。
修正方案
把构造函数和setter方法里的局部变量声明去掉,直接给类成员变量赋值;或者更规范的用构造函数初始化列表来初始化成员变量。
修正后的完整代码
#include <string> #include <iostream> using namespace std; class CCourse { public: // 无参构造函数:用初始化列表初始化成员 CCourse() : name("p"), average(0.0), maxEnrollment(0) {} // 带参构造函数:用初始化列表更高效规范 CCourse(string course101, double avg, unsigned int MaxE) : name(course101), average(avg), maxEnrollment(MaxE) {} ~CCourse() { cout << "CCourse destructed" << endl; } void setCourseName(string course101) { name = course101; // 直接给类成员赋值,不再声明局部变量 } void setAverage(double avg) { average = avg; } void setMaxE(unsigned int MaxE) { maxEnrollment = MaxE; } string getCourseName() { return name; } double getAverage() { return average; } unsigned int getMaxE() { return maxEnrollment; } private: string name; double average; unsigned int maxEnrollment; }; const int NUM_COURSES = 10; int main() { CCourse courses[NUM_COURSES] = { { "BIT2400", 71.0, 90 }, { "BIT1400", 52.7, 140 }, { "ITEC2100", 85.3, 15 }, { "BIT2000", 85.3, 15 } }; string x = courses[0].getCourseName(); cout << x; // 现在会输出正确的"BIT2400" }
关键修改点说明
- 构造函数改用初始化列表:这是C++初始化类成员的推荐方式,比在构造函数体内赋值更高效,尤其是对于string这类对象。
- 去掉所有setter方法里的局部变量声明:直接对类成员变量赋值,确保修改的是类的私有成员而不是临时局部变量。
- 无参构造函数也用初始化列表统一风格,避免重复错误。
测试这段代码,courses[0].getCourseName()会返回正确的"BIT2400",其他get方法也会返回初始化的正确值。
内容的提问来源于stack exchange,提问作者pchong
相关产品推荐
相关产品推荐

