GESP 六级 · GESP 202312 C++ 六级 第 2 题

选择题 · 答案 C

← 整套速查表 GESP 六级 全部真题

题目

有关下面 C++ 代码的说法,错误的是( )。

class Rectangle
{
private:
    class Point
    {
    public:
        double x;
        double y;
    };
    Point a, b, c, d;
    double length;
    double width;
public:
答案:C

解题思维

这道题考的是C++类嵌套与成员访问规则,核心就是区分‘嵌套’和‘公开’,拿到题先想:Point是Rectangle的私有成员,不是全局变量,所以访问必须用Rectangle::Point。

常见错误

很多同学看到类里面有个类,就以为可以直接用Point,或者认为内部类默认是公开的,这是把‘嵌套’和‘公开’混淆了。内部类确实是外部类的成员,默认是私有的,外部类内部可以直接用Point,但外部类外部访问必须用Rectangle::Point,不能随便写Point p;。另外,有些同学会纠结内部类能不能访问外部类的成员,其实内部类作为成员,可以直接访问外部类的私有成员,这点和外部类访问内部类不同。

详细解析(节选)

【考点】类嵌套|内部类访问控制|作用域运算符

C++允许在类内部嵌套定义另一个类,这种嵌套类被称为内部类,定义它的类被称为外部类。内部类是外部类的成员变量(尽管它没有名字,而是直接作为成员存在),因此默认具有外部类的访问属性——如果外部类是public的,内部类也是public的;如果外部类是private的,内部类也是private的。在本题中,Rectangle是public类,Point是它的成员,所以Point在Rectangle内部可以直接访问,但在Rectangle外部访问时,必须通过作用域运算符Rectangle::Point来指定。选项A、B、D都是对这一规则的正确描述,只有C说‘内部类可以随便访问,不需要通过外部类来访问’,这显然是错误的,因为内部类是外部类的成员,外部类外部访问时必须用外部类名限定。命题人专卡这一易错点——绝大多数考生看到嵌套就以为能直接访问,完全没意识到内部类默认为私有成员。解题思维回归C++语法:嵌套类是外部类的成员,成员默认私有。访问成员的标准路径是外部类名::成员名。因此Rectangle::Point才是合法写法。选项D直接陈述这一规范,必对;A、B属于定义性陈述,无争议。陷阱拆解方面,选项C的‘随便访问’是典型偷换概念——把‘嵌套’理解成‘公开’。内部类确实写在外部类作用域内,但不是全局变量,外部无法直接写Point p;,必须写成Rectangle::Point p;。命题人专挑‘不需要通过外部类’这句绝对化表述下套,不细读语法的人必掉坑。反命题思维:若把C改成‘内部类必须通过外部类访问’,就变成正确选项;若把D中的Rectangle::Point写成Point,答案立刻反转。刷到此类题先问自己:这到底是成员还是全局?成员必须用作用域运算符。

在 OI伴学 里做这道题
登录后可计时作答、查看完整六段式解析,并按你的错题自动生成同类练习。
去刷题先做一次 AI 学情诊断