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

请问这个C++ Rectangle类存在哪些问题?

你的Rectangle类存在的几个关键问题

我帮你梳理下这段C++代码里的问题,一个个拆解来看:

  • Set函数的返回值逻辑错误
    你声明Set函数返回double类型,但函数实现里完全没有return语句,这会触发未定义行为——编译器可能不会直接报错,但程序运行时会出现不可预料的结果。而且从语义上来说,设置宽高的函数根本不需要返回值,建议把它改成void类型:

    // 类内声明修改
    void Set(double x, double y);
    // 对应实现修改
    void Rectangle::Set(double x, double y) {
        width = x;
        height = y;
    }
    
  • getPerimeter函数代码不完整
    你贴的代码里getPerimeter的实现写到(width * 2) + (height ...就中断了,这会直接导致编译失败。正确的周长计算逻辑应该是:

    double Rectangle::getPerimeter() {
        return 2 * (width + height);
    }
    
  • 只读成员函数未加const修饰
    getArea和getPerimeter都是只读操作,不会修改类的成员变量,应该把它们声明为const成员函数——这样这些函数就能被const类型的Rectangle对象调用,这是C++里的良好编码习惯:

    // 类内声明修改
    double getArea() const;
    double getPerimeter() const;
    // 对应实现添加const
    double Rectangle::getArea() const {
        return height * width;
    }
    double Rectangle::getPerimeter() const {
        return 2 * (width + height);
    }
    
  • 构造函数可以优化为成员初始化列表
    当前构造函数是在函数体内给width和height赋值,用成员初始化列表会更高效(尤其是针对复杂成员类型),代码也更简洁:

    Rectangle::Rectangle() : width(1), height(1) {}
    
  • 缺少参数合法性校验
    Set函数没有检查传入的x和y是否为正数——矩形的宽高应该是大于0的数值,否则计算出来的面积、周长没有实际意义。你可以添加简单的校验逻辑,比如:

    void Rectangle::Set(double x, double y) {
        if (x > 0 && y > 0) {
            width = x;
            height = y;
        } else {
            // 可以选择设置默认值,或者抛出异常,这里举默认值的例子
            width = 1;
            height = 1;
            cerr << "Invalid width/height, reset to default 1" << endl;
        }
    }
    

另外提个小细节:using namespace std;在大型项目里容易引发命名冲突,建议尽量避免,改用std::cout、std::cerr这样的显式命名空间调用。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.22 08:59:01