二级C++机试改错与函数优化

需积分: 3 1 下载量 9 浏览量 更新于2024-09-19 收藏 76KB DOC 举报
本题是针对C++二级考试的上机试题,着重考察了面向对象编程的基本概念和函数调用。题目要求考生对提供的源程序文件`test18_1.cpp`进行修改,解决其中的错误。首先,我们来看一下存在的问题: 1. 错误1:inlineradius() - 函数定义错误:题目指出在代码中有一个名为`inlineradius()`的内联函数,但这在C++中是不推荐的,因为内联函数(inline)应该用于小型、频繁被调用且没有副作用的函数。在这里,计算圆的半径涉及到乘法和平方根运算,更适合作为非内联成员函数。正确的做法是将`inline`关键字移除,将其改为普通成员函数`doubleradius()`。 2. 错误2:p.x+=5;p.y+=6; - 属性修改错误:这里试图直接通过对象的成员变量`x`和`y`进行增量操作,但在面向对象编程中,应当使用成员函数来改变对象的状态。正确的做法是调用`set`方法,将增量结果传递给`xoffset()`和`yoffset()`,然后设置新的坐标,即`p.set((p.xoffset()+5), (p.yoffset()+6))`。 3. 错误3:缺少保护成员和构造函数 - 题目提到应在结构体`point`中添加保护成员,以及可能的构造函数。由于题目未提供完整代码,我们可以假设`x`和`y`应是私有成员,并添加一个默认构造函数`point()`以便实例化对象。完整的代码可能如下所示: ```cpp class point { private: double x; double y; public: // 默认构造函数 point() : x(0), y(0) {} void set(double ix, double iy) { x = ix; y = iy; } double xoffset() const { return x; } double yoffset() const { return y; } double angle() const { return (180 / 3.14159) * atan2(y, x); } // 更正后的radius方法 double doubleradius() const { return sqrt(x * x + y * y); } // 修改后的增量操作 void set_offset(double xoffset, double yoffset) { p.set(x + xoffset, y + yoffset); } }; ``` 在`main`函数中,应使用修正后的`set_offset`方法: ```cpp void main() { point p; double x, y; cout << "Enter x and y:\n"; cin >> x >> y; p.set(x, y); p.set_offset(5, 6); // ... } ``` 通过这次改错,考生不仅需要熟悉C++的语法,还要理解面向对象编程的原则,特别是如何正确地操作对象属性和调用成员函数。这是一个综合运用类的封装、数据隐藏和继承等特性的好例子。