请问这个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
相关产品推荐
相关产品推荐

