新浪首页 > 新浪教育 > 自学考试 > 正文

2004年自考面向对象程序设计模拟试题(三)

http://www.sina.com.cn 2004/10/21 14:25  华夏大地教育网

  


  三,改错题(本大题共5小题,每小题2分,共10分)

  21.分析下列程序中的错误,并说明出错原因。

    # include

    class base {

    const int n;

    public:

    base() { cout<<”Initializing default\n”; }

    base(int m) { cout<<”Initializing\n”; n=m; }

    ~base() { cout<<”Destroying\n”; }

    };

    void main()

    { base x=1;

    base y=x;

    }

       答:(1) n=m; const数据成员不以该形式赋值

    (2)错误处base y=x;,以对象初始化对象

  [解析](1)作为const数据成员n不能用赋值表达式的形式为其赋初值,必须在定义构造函数时在函数头中以“base(int m):n(m)”形式来初始化。

    (2)base y=x; 语句中‘=’不是赋值的意思,而是初始化的意思。即在定义类base的对象y时,以对象x给它初始化,相当于base y(x);。但是以对象初始化对象时,必须调用拷贝构造函数才行。因程序中没给出拷贝构造函数,也不能调用系统的缺省拷贝构造函数,因用户给出了构造函数后,再也不能调用系统提供的任何缺省构造函数。所以,base y=x;是错误的。

  22.分析下列程序中的错误,并说明出错原因。

    #include

    class AA {

    public: int aa;

    };

    class BB:virtual public AA {

    int bb;

    };

    class CC:virtual public AA {

    public: int bb;

    };

    class DD:public BB,public CC {

    public: float dd;

    };

    void main()

    { DD p;

    int m=p.aa;

    AA *pr=&p;

    AA &pt=p;

    DD *pp=(DD *)(BB *)pr;

    AA r;

    DD &ps=r;

    }

       答:(1)DD *pp=(DD *)(BB *)pr;,虚基类指针不能赋给派生类指针

    (2)DD &ps=r;,虚基类对象不能初始化派生类对象引用

  [解析]赋值兼容规则的三条规则是:公有派生的情况下,派生类的对象可以赋给基类的对象;派生类的对象可以初始化基类对象的引用;派生类对象地址可以赋给指向基类对象的指针。反过来,以上三条规则是错误的。

    (1)将虚基类AA的指针pr赋给派生类DD的指针pp,这违背了赋值兼容规则。

    (2)虚基类AA的对象r初始化派生类DD的引用ps,这违背了赋值兼容规则。

  23.分析下列程序中的错误,并说明出错原因。

    #include

    class A {

    int x;

    public:

    A(int a) { x=a; fun(); }

    virtual void fun()=0;

    };

    class B:public A {

    public:

    B(int b) :A(b) {}

    void fun() { }

    };

    void main()

    { A aa(5);

    B bb(8);

    }

       答:(1)fun();,构造函数不能调用纯虚函数

    (2)A aa(5); 抽象类不能定义对象

  [解析](1)在构造函数“A(int a)”调用了纯虚函数“fun()”,因构造函数调用虚函数是静态联编,即调用的是它自己类的虚函数。在此调用的是纯虚函数,它只被说明,而未定义,所以不可能被执行,因此出错。

    (2)抽象类相当于是对类的引用性声明,所以它只能定义该类的指针和引用,而不能定义它的对象。在此,A为抽象类,而“A aa(5)”却定义了A的对象,因此是错误的。

  24.分析下列程序中的错误,并说明出错原因。

    #include

    void fun()

    { ifstream myfile(“d:\abcd”);

    myfile<<”my file\n”;

    }

    void main()

    { fun(); }

       答:(1)ifstream ,输出必须用输出流ofstream

    (2)myfile(“d:\abcd”);,必须用‘\’

  [解析](1)由函数“fun()”的函数体可见,它要输出信息“my file”,为此必须让文件与输出流相关联,但“ifstream”是输入流,与之关联的文件只能输入信息。所以,必须使用输出流“ofstream”。

    (2)作为文件面的“d:\abcd”是字符串,其中字符‘\’一般作为转义符使用。为了在字符串中使用该字符的原义必须用双字符,即“\”。

  25.分析下列程序中的错误,并说明出错原因。

    #include

    class AA {

    int aa;

    AA(int xx) { aa=xx; }

    public:

    int get() { return aa; }

    ~AA() { cout<<”Destroying”<

    };

    main()

    { AA elem[3]={5,8,4};

    for (*int i=0;i<3;i++) cout<

    }

       答:(1)AA(int xx) 的访问属性错、应具有公有属性

    (2)数组elem[3]初始化错、因调用构造函数

  [解析](1)构造函数虽是由系统自动调用来生成对象的,但一般都是在类外调用,所以它的访问属性必须是公有的。程序中构造函数的访问属性是私有的(缺省值),运行中必定出错。

    (2)对于数组元素的初始化,当程序中提供了带参构造函数时,一般不能直接用数值表的形式来实现(如程序中所示),对只含有一个参数的构造函数,初始化数组的实现方式如下所示:AA elem[3]={ AA(5),AA(8),AA(4)};


  特别说明:由于各方面情况的不断调整与变化,新浪网所提供的所有考试信息仅供参考,敬请考生以权威部门公布的正式信息为准。


评论】 【推荐】 【 】 【打印】 【下载点点通】 【关闭


    



新 闻 查 询
关键词一
关键词二
服饰 首饰 手机
电器 MP3 数码相机
热 点 专 题
中超俱乐部酝酿大变革
阿里汉下课几成定局
北京新交法听证报告
考研大讲堂 报考指南
2004中华小姐环球大赛
京城劣质楼盘备忘录
调查:南方周末创富榜
安妮宝贝笔记连载
全国万家餐馆网友热评

 
 ⊙ 分类信息 投资赚钱的秘密武器!糖尿病你往哪里逃! 权威医院治愈高血压!
·高血压人要“解放”! ·治疗皮肤癣最新成果 ·治股骨头坏死新突破 ·如果你有胃肠道疾病?
·今年哪些项目最赚钱? ·几千元创业的好项目 ·好生意,一月收回投资! ·疤痕疙瘩、痤疮一扫光
·香港女鞋女包火爆招商 ·小项目玩赚大市场 ·幼教新模式火爆全球 ·权威治皮肤顽疾白斑症
·男人酷女人爱赚男人钱 ·投资几千元快活做老板 ·攻克皮肤癣,靓丽肌肤 ·280-1680元治愈糖尿病
 



文化教育意见反馈留言板电话:010-62630930-5178 欢迎批评指正

新浪简介 | About Sina | 广告服务 | 招聘信息 | 网站律师 | SINA English | 产品答疑

Copyright © 1996 - 2004 SINA Inc. All Rights Reserved

版权所有 新浪网
北京市通信公司提供网络带宽