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)}; |