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

我的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"
}

关键修改点说明

  1. 构造函数改用初始化列表:这是C++初始化类成员的推荐方式,比在构造函数体内赋值更高效,尤其是对于string这类对象。
  2. 去掉所有setter方法里的局部变量声明:直接对类成员变量赋值,确保修改的是类的私有成员而不是临时局部变量。
  3. 无参构造函数也用初始化列表统一风格,避免重复错误。

测试这段代码,courses[0].getCourseName()会返回正确的"BIT2400",其他get方法也会返回初始化的正确值。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.24 23:45:40