1、国家二级( C+)机试模拟试卷 184及答案与解析 一、选择题 1 一个栈的初始状态为空。现将元素 1、 2、 3、 4、 5、 A、 B、 C、 D、 E依次入栈,然后再依次出栈,则元素出栈的顺序是 ( )。 ( A) 12345ABCDE ( B) EDCBA54321 ( C) ABCDEl2345 ( D) 54321EDCBA 2 下列叙述中正确的是 ( )。 ( A)循环队列有队头和队尾两个指针,因此,循环队列是非线性结构 ( B)在循环队列中,只需要队头指针就能反映队列中元素的动态变化情况 ( C)在循环 队列中,只需要队尾指针就能反映队列中元素的动态变化情况 ( D)循环队列中
2、元素的个数是由队头指针和队尾指针共同决定 3 在长度为 n的有序线性表中进行二分查找,最坏情况下需要比较的次数是 ( )。 ( A) O(n) ( B) O(n2) ( C) O(log2n) ( D) O(nlog2n) 4 下列叙述中正确的是 ( )。 ( A)顺序存储结构的存储一定是连续的,链式存储结构的存储空间不一定是连续的 ( B)顺序存储结构只针对线性结构,链式存储结构只针对非线性结构 ( C)顺序存储结构能存储有序 表,链式存储结构不能存储有序表 ( D)链式存储结构比顺序存储结构节省存储空间 5 数据流图中带有箭头的线段表示的是 ( )。 ( A)控制流 ( B)事件驱动 (
3、C)模块调用 ( D)数据流 6 在软件开发中,需求分析阶段可以使用的工具是 ( )。 ( A) N-S图 ( B) DFD图 ( C) PAD图 ( D)程序流程图 7 在面向对象方法中,不属于 “对象 ”基本特点的是 ( )。 ( A)一致性 ( B)分类性 ( C)多态性 ( D)标识唯一性 8 一间宿舍可住多个学生,则 实体宿舍和学生之间的联系是 ( )。 ( A)一对一 ( B)一对多 ( C)多对一 ( D)多对多 9 在数据管理技术发展的三个阶段中,数据共享最好的是 ( )。 ( A)人工管理阶段 ( B)文件系统阶段 ( C)数据库系统阶段 ( D)三个阶段相同 10 有三个关
4、系 R、 S和 T如下:由关系 R和 S通过运算得到关系 T,则所使用的运算为 ( )。 ( A)笛卡尔积 ( B)交 ( C)并 ( D)自然连接 11 下列语句中,错误的是 ( )。 ( A) const int buffer 256; ( B) const double * point; ( C) int const buffer 256; ( D) double * const point; 12 if语句的语法格式可描述为: 格式 1: if()语句 或 格式 2: if(条件 )语句 1 else语句 2 关于上面的语法格式,下列表述中错误的是 ( )。 ( A)条件 部分可以是一
5、个 if语句,例如 if(if(a 0) ( B)语句部分可以是一个 if语句,例如 if()if() ( C)如果在条件前加上逻辑非运算符 !并交换语句 1和语句 2的位置,语句功能不变 ( D)语句部分可以是一个循环语句,例如 if()while() 13 有如下说明: int a10 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, *p a; 则数值为 9的表达式是 ( )。 ( A) *p 9 ( B) *(p 8) ( C) *p 9 ( D) p 8 14 有如下程序段: int i 0, j 1; int &r i; r j; int * p &i; * p &r;
6、 其中会产生编译错误的语句是 ( )。 ( A) ( B) ( C) ( D) 15 下列字符串中,不可以用做 C标识符的是 ( )。 ( A) y_2006 ( B) _TEST_H ( C) Return ( D) switch 16 为了取代 C扣带参数的宏,在 C中使用 ( )。 ( A)重载函数 ( B)内联函数 ( C)递归函数 ( D)友元函数 17 通过运算符重载,可 以改变运算符原有的 ( )。 ( A)操作数类型 ( B)操作数个数 ( C)优先级 ( D)结合性 18 在函数中,可以用 auto、 extem、 register和 static这四个关键字中的一个来说明变
7、量的存储类型,如果不说明存储类型,则默认的存储类型是 ( )。 ( A) auto ( B) extem ( C) register ( D) static 19 下列运算符函数中肯定不属于类 FunNumber。的成员函数的是 ( )。 ( A) int operator (FunNumber); ( B) FunNumber operator (); ( C) FunNumber operator (int); ( D) int operator (FunNumber, FunNumber); 20 若有下面的函数调用: fun(a b, 3, max(n 1, b) 则 fun的实参个数
8、是 ( )。 ( A) 3 ( B) 4 ( C) 5 ( D) 6 21 关于运算符重载,下列表述中正确的是 ( )。 ( A) C已有的任何运算符都可以重载 ( B)运算符函数的返回类型不能声明为 基本数据类型 ( C)在类型转换符函数的定义中不需要声明返回类型 ( D)可以通过运算符重载来创建 C中原来没有的运算符 22 有如下程序: #include iostream using namespace std; int main() void function(double val); double val; function(val); cout val: return 0; void
9、 function(double val) val 3; 编译运行这个程序将出现的情况是 ( )。 ( A)编译出错,无法运行 ( B)输出: 3 ( C)输出: 3 0 ( D)输出一个不确定的数 23 下列情况中,不会调用拷贝构造函数的是 ( )。 ( A)用一个对象去初始化同一类的另一个新对象时 ( B)将类的一个对象赋值给该类的另一个对象时 ( C)函数的形参是类的对象,调用函数进行形参和实参结合时 ( D)函数的返回值是类的对象,函数执行返回调用时 24 以下关键字不能用 来声明类的访问权限的是 ( )。 ( A) public ( B) static ( C) protected
10、( D) private 25 由于常对象不能被更新,因此 ( )。 ( A)通过常对象只能调用它的常成员函数 ( B)通过常对象只能调用静态成员函数 ( C)常对象的成员都是常成员 ( D)通过常对象可以调用任何不改变对象值的成员函数 26 下列有关继承和派生的叙述中,正确的是 ( )。 ( A)如果一个派生类公有继承其基类,则该派生类对象可以访问基类的保护成员 ( B)派生类的成员 函数可以访问基类的所有成员 ( C)基类对象可以赋值给派生类对象 ( D)如果派生类没有实现基类的一个纯虚函数,则该派生类是一个抽象类 27 在公有继承的情况下,允许派生类直接访问的基类成员包括 ( )。 (
11、A)公有成员 ( B)公有成员和保护成员 ( C)公有成员、保护成员和私有成员 ( D)保护成员 28 有如下程序: #include iostream using namespace std; class Base public: void fun()cout “Base fun“ end1; ; class Derived: public Base public: void fun() cout “Derived fun“ end1: ; int main() Derived d; d fun(); return 0; 已知其执行后的输出结果为: Base fun Derived fun
12、则程序中下匦线处应填入的语句是 ( )。 ( A) Base fun(); ( B) Base fun(); ( C) Base fun(); ( D) fun(); 29 有如下程序: #include iostream using namespace std; class MyClass public: MyClass() cout A; MyClass(char c) cout c; MyClass() cout B; ; int main() MyClass p1, *p2; p2 new MyClass(X); delete p2; return 0; 执行这个程序的输出结果是 (
13、)。 ( A) ABX ( B) ABXB ( C) AXB ( D) AXBB 30 有如下程序: #include iostream using namespace std; int i 1; class Fun public: static int i; int value()return i 1; int value()eonstreturn i 1; ; int Fun i 2; int main() int i 3; Fun fun1; const Fun fun2; _ return 0; 若程序的输出结果是: 123 则程序中下画 线处遗漏的语句是 ( )。 ( A) cout
14、 fun1 value() Fun i fun2 value(); ( B) cout Fun i fun1 value() fun2 value(); ( C) cout fun1 value() fun2 value() Fun i; ( D) cout fun2 value() Fun i fun1 value(); 31 有如下程序: #include iostream using namespaee std; class Obj static int i; public: obj() i; obj() i; static int getVal() return i; ; int ob
15、j i 0: void f() obj oh2; cout ob2 getVal(); int main() obj ob1; f(); Obj * ob3 new obj; cout oh3 getVal(); delete ob3; cout obj getVal(); return 0; 执行这个程序的输出结果是 ( )。 ( A) 232 ( B) 231 ( C) 222 ( D) 221 32 有如下程序: #include iostream using namespaee std; class Pair int m, n; public: Pair(int j, int k):
16、m(j), n(k) int get() return m; int get()eonst return m n; ; int main() Pair a(3, 5); eonst Pair b(3, 5); cout a get() b get(); return 0; 执行这个程序的输出结果是 ( )。 ( A) 33 ( B) 38 ( C) 83 ( D) 88 33 有如下程序: #include iostream using namespace std; class Base protected: Base() cout A; Base(char c)cout c; ; class
17、 Derived: public Base public: Derived(char c) cout c; ; int main() Derived d1(B); return 0; 执行这个程序的输出结果是 ( )。 ( A) B ( B) BA ( C) AB ( D) BB 34 有如下类定义: class MyBase int k; public: MyBase(int n 0): k(n) int value()const return k; ; class MyDerived: MyBase int j; public: MyDerived(int i): j(i) int get
18、K()eonstreturn k; int getJ()eonstreturn j; ; 编译时发现有一处语法错误,对这个错误最准确的描述是 ( )。 ( A)函数 getK试图访问基类的私有成员变量 k ( B)在类 MyDerived的定义中,基类名 MyBase前缺少关键字 public、 protected或 private ( C)类 MyDerived缺少一个无参的构造函数 ( D)类 NyDerived的构造函数没有对基类数据成员 k进行初始化 35 有如下程序: #include iostrearn using namespace std; class Instrument p
19、ublic: virtual void Display() 0; ; class Piano: public Instrument public: void Display() *函数体略 * ; int main() Instrument s; Instrument * p 0; : return 0; 下列叙述中正确的是 ( )。 ( A)语句 “Insturment*p 0; ”编译时出错 ( B)语句 “Instrument s; ”编译时出错 ( C)类 Piano中的 Display函数不是虚函数 ( D)类 Instrument是一个虚基类 36 有如下程序: #include
20、iostream using namespace std; class A public: virtual void funcl()cout “A1“; void func2() cout “A2“; ; class B: public A public: void funcl()cout “B1“; void func2()cout “B2“; ; int main() A*p new B; P func1(); P func2(); delete p; return 0; 执行这个程序的输出结果是 ( )。 ( A) B182 ( B) A1A2 ( C) B1A2 ( D) A182 3
21、7 关于在调用模板函数时模板实参的使用,下列表述中正确的是 ( )。 ( A)对于虚拟类型参数所对应的模板实参,如果能从模板函数的实参中获得相同的信息,则都可以省略 ( B)对于虚拟类型参数所对应的模板实参,如果它们是参数表中的最后的若干个参数,则都可以省略 ( C)对于虚拟类型参数所对应的模板实参,若能够省略则必须省略 ( D)对于常规参数 所对应的模板实参,任何情况下都不能省略 38 关于关键字 class和 typename,下列表述中正确的是 ( )。 ( A)程序中的 typename都可以替换为 class ( B)程序中的 class都可以替换为 typename ( C)在模板
22、形参表中只能用 typename来声明参数的类型 ( D)在模板形参表中只能用 class或 typename来声明参数的类型 39 在下列枚举符号中,用来表示 “相对于当前位置 ”文件定位方式的是 ( )。 ( A) ios_base cur ( B) ios_base beg ( C) ios_base out ( D) ios_base end 40 下列关于 C流的描述中,错误的是 ( )。 ( A) cout A表达式可输出字符 A ( B) eof()函数可以检测是否到达文件尾 ( C)对磁盘文件进行流操作时,必须包含头文件 fstream ( D)以 ios_base out模式
23、打开的文件不存在时,将自动建立一个新文件 二、基本操作题 41 使用 VC6打开考生文件夹 proj1下的工程 proj1,其中定义了一个 CD类。程序中位于每个 ERROR*found*下的语句行有错误,请加以更正,不得修改程序的其他部分。更正后程序的输出应该是: 歌唱祖国 30 义勇军进行曲 95 注意:只能修改每个 ERROR*found*下的那一行,不要改动程序中的其他内容。 #include iostream #include cstring using namespaee std; class CD char name20; int number; public: void ini
24、t(char*aa, int bb) ERROR*found* name aa: number bb; char*getName( ) ERROR*found* return * name: int getNumber( )return number; void output( ) ERROR*found* cout name20 number end1: ; void main() CD dx, dy; dx init(“歌唱祖国 “, 30); dy init(“义勇军进行曲 “, 3*dx getNumber( ) 5); dx output( ); dy output( ); 三、简单
25、应用题 42 请使用 VC6或使用【答题】菜单打开考生文件夹 proj2下的工程 proj2,该工程中包含一个程序文件 main cpp,其中有日期类 Date、人员类 Person及排序函数sortByName和主函数 main的定义。请在程序中的横线处填写适当的代码并删除横线,以实现上述类定义和函数定义。此程序的正确输出结果应为: 按姓名排序 排序前: 张三 男 出生日期: 1978年 4月 20日 王五 女 出生日期: 1965年 8月 3日 杨六 女 出生日期: 1965年 9月 5日 李四 男 出生日期: 1973年 5月 30日 排序后: 李四 男 出生日期: 1973年 5月 3
26、0日 王五 女 出生日期: 1965年 8月 3日 杨六 女 出生日期: 1965年 9月 5日 张三 男 出生日期: 1978年 4月 20日 注意:只能在横线处填写适当的代码,不要改动程序中的其他内容,也不要删除或移动 “ *found*”。 #include iostream using namespace std; class Date 日期类 int year, month, day;年、月、日 public: Date(int year, int month, int day): year(year), month(month), day(day) int getYear( )co
27、nstreturn year; int getMonth( )constreturn month; int getDay( )eonstreturn day; ; class Person 人员类 char name14;姓名 bool is_male;性别,为 true时表示男性 Date birth_date;出生日期 public: Person(char * name, bool is_male, Date birth_date) *found* : _ strcpy(this name, name); const char * getName( )constreturn name;
28、bool isMale( )eonstreturn is_male; Date getBirthdate( )constreturn birth_date; 利用 strcmp( )函数比较姓名,返回一个正数、 0或负数,分别表示大于、等于、小于 int compareName(const Person &p)const *found* _ void show( ) cout end1: cout name “ (is_male?“男 “: “女 “) “ “出生日期: “birth_date getYear( ) “年 “显示出生年 *found* 显示出生月 birth_date getD
29、ay( ) “日 “;显示出生日 ; void sortByName(Person ps , int size) 将人员数组按姓名排列为升序 for(int i 0; i size 1; i ) 采用选择排序算法 int m i: for(int j i 1; j size; j ) if(psij compareName(psm) 0) m j; if(m i) Person p psm; psm psi; psi p; int main( ) Person staff Person(“张三 “, true, Date(1978, 4, 20), Person(“王五 “, false, D
30、ate(1965, 8, 3), Person(“杨六 “, false, Date(1965, 9, 5), Person(“李四 “, true, Date(1973, 5, 30) ; const int size sizeof(staff) sizeof(staff0); int i; cout end1 “按姓名排序 “; cout end1 “排序前: “; for(i 0; i size; i )staffi show( ); sortByName(staff, size); cout end1 end1 “排序后: “; for(i 0; i size; i )staffi s
31、how( ); cout end1: return 0; 四、综合应用题 43 请使用 VC6或使用【答题】菜单打开考生目录 proj3下的工程文件 proj3,此工程中包含一个源程序文件 proj3 cpp,补充编制 C程序 proj3 cpp,其功能是读取文本文件 in dat中的全部内容,将文本存放到 doc类的对象 myDoc中。然后将 myDoe中的字符序列反转,并输出到文件 out dat中。文件 in dat的长度不大于 1000字节。 要求: 补充编制的内容写在 “ *333*”与“*66666*”两行之间。实现将 myDoc中的字符序列反转,并将反转后的序列在屏幕上输出。不得
32、修改程序的其他部分。 注意:程序最后已将结果输出到文件 out dat中,输出函数 writeToFile已经给出并且调用。 proj3 cpp #include iostream #include fstream #include cstring using namespace std; class doc private: char*str;文本字符串首地址 int length;文本字符个数 public: 构造函数,读取文件内容,用于初始化新对象, filename是文件名字符串首地址 doe(char*filename); void reverse();将字符序列反转 doe();
33、void writeToFile(char*filename); ; doc doc(char*filename) ifstream myFile(filename); int len 1001, tmp; str new charlen; length 0; while(tmp myFile get()! EOF) strlength tmp; strlength 0; myFile close(); void doe reverse() 将数组 str中的 length个字符中的第一个字符与最后一个字符交换,第二个字符与倒数第二个 字符交换 *333* *666* doe doe() de
34、letestr; void doe writeToFile(char * filename) ofstream outFile(filename); outFile str; outFile close(); void main() doe myDoe(“in dat“); myDoe reverse(); myDoc writeToFile(“out dat“); 国家二级( C+)机试模拟试卷 184答案与解析 一、选择题 1 【正确答案】 B 【试题解析】 栈是先进后出的原则组织数据,所以入栈最早的最后出栈,所以选择 B。 2 【正确答案 】 D 【试题解析】 循环队列有队头和队尾两个指
35、针,但是循环队列仍是线性结构的,所以 A错误;在循环队列中需要队头指针与队尾指针来共同反映队列中元素的动态变化情况,所以 B与 C错误。 3 【正确答案】 C 【试题解析】 当有序线性表为顺序存储时才能用二分法查找。可以证明的是对于长度为 n的有序线性表,在最坏情况下,二分法查找只需要比较 log2n次,而顺序查找需要比较 n次。 4 【正确答案】 A 【试题解析】 链式存储结构既可以针对线性结构也可以针对非线性结构,所以 B与 C错误。链式存储结构中每 个结点都由数据域与指针域两部分组成,增加了存储空间,所以 D错误。 5 【正确答案】 D 【试题解析】 数据流图中带箭头的线段表示的是数据流
36、,即沿箭头方向传送数据的通道,一般在旁边标注数据流名。 6 【正确答案】 B 【试题解析】 在需求分析阶段可以使用的工具有数据流图 DFD图,数据字典DD,判定树与判定表,所以选择 B。 7 【正确答案】 A 【试题解析】 对象有如下一些基本特点:标识唯一性、分类性、多态性、封装性、模块独立性好。所以选择 A。 8 【正确答案】 B 【试 题解析】 因为一间宿舍可以住多个学生即多个学生住在一个宿舍中,但一个学生只能住一间宿舍,所以实体宿舍和学生之间是一对多的关系。 9 【正确答案】 C 【试题解析】 数据管理发展至今已经历了三个阶段:人工管理阶段、文件系统阶段和数据库系统阶段。其中最后一个阶段
37、结构简单,使用方便逻辑性强物理性少,在各方面的表现都最好,一直占据数据库领域的主导地位,所以选择 C。 10 【正确答案】 D 【试题解析】 自然连接是一种特殊的等值连接,它要求两个关系中进行比较的分量必须是相同的属性组,并且在结果中把 重复的属性列去掉,所以根据 T关系中的有序组可知 R与 S进行的是自然连接操作。 11 【正确答案】 D 【试题解析】 const是一个 C关键字,用于限定不允许改变的变量。选项 B是指向常量的指针,定义时可以不初始化;选项 D是指针常量,定义时必须初始化。故答案为 D。 12 【正确答案】 A 【试题解析】 本题考查 if语句, if语句的条件部分不能嵌套
38、if语句,所以 A选项错误; B选项就是 if语句嵌套; C选项其实就是将判断条件颠倒,然后执行语句也颠倒,所以效果一样; D选项也正确。 13 【正确 答案】 B 【试题解析】 本题考查指向数组的指针,本题中指针变量 p指向数组 a,那么 *p的值就是 1,即表示数组的第一个元素,那么数值为 9的表达式就是将指针向后移动 8个地址,即 p 8指向的是数组元素值为 9,所以数值为 9的表达式是 *(p8)。 14 【正确答案】 A 【试题解析】 本题考查指针和引用。 为引用,使用正确; 中 &r表示一个地址,而 *p已经是一个值了,不能将一个指针赋值给一个值,所以编译错误。 15 【正确答案】
39、 D 【试题解析】 本题考查 C标识符的命名规则,其规则有如 下几点: 所有标识符必须由字母,数字或下画线组成,且必须由字母或下画线开头; 所有标识符不能使用 C已有的关键字; 大、小写字母表示不同意义,即代表不同的标识符。选项 C中虽然 return是关键字,但因首字母大、小写不同,也可用于标识符,但不建议使用。故答案为 D。 16 【正确答案】 B 【试题解析】 一般函数进行调用时,要将程序执行权转到被调用函数中,然后再返、回到调用它的函数中;而内联函数在调用时,是将调用表达式用内联函数体来替换,即类似于宏。 17 【正确答案】 A 【试题解析】 重载运算符的规则如下: C不允许用户自己定
40、义新的运算符,只能对已有的 C运算符进行重载; C不能重载的运算符只有 5个; 重载不能改变运算符运算对象的个数; 重载不能改变运算符的优先级和结合性; 重载运算符的函数不能有默认的参数; 重载的运算符必须和用户定义的自定义类型的对象一起使用,至少应有一个是类对象,即不允许参数全部是 C+的标准类型。故本题答案为 A。 18 【正确答案】 A 【试题解析】 变量的存储方法分为静态存储和动态存储两大类,包含 4种:自动的 (auto)、静态的 (static)、寄存器的 (register)、外部的 (extern)。变量如果没有说明存储类型,那么默认就是 auto。 19 【正确答案】 D 【
41、试题解析】 本题考查运算符重载的一些规则: 一般情况下,单目运算符最好重载为类的成员函数,双目运算符则最好重载为类的友元函数; 双目运算符、 ( )、 、不能重载为类的友元函数; 类型转换函数只能定义为一个类的成员函数,而不能定义为类的友元函数; 若一个运算符的操作需要修改对象的状态,选择重载为成员函数较好; 若运算符所需的操作数 (尤其是第一个操作数 )希望有 隐式类型转换,则只能选用友元函数; 当运算符函数是一个成员函数时,最左边的操作数 (或者只有最左边的操作数 )必须是运算符类的一个类对象 (或者是对该类对象的引用 );如果左边的操作数必须是一个不同类的对象,或者是一个内部类型的对象,
42、该运算符函数必须作为一个友元函数来实现。所以答案为D。 20 【正确答案】 A 【试题解析】 本题考查函数实参个数的基础知识,根据实参的概念, (a b)、3、 max(n 1, b)分别为其中的 3个实参。故答案为 A。 21 【正确答案】 C 【试题解析】 重载运算符的规 则如下: C不允许用户自己定义新的运算符,只能对已有的 C+运算符进行重载; C不能重载的运算符只有 5个; 重载不能改变运算符运算对象的个数; 重载不能改变运算符的优先级和结合性; 重载运算符的函数不能有默认的参数; 重载的运算符必须和用户定义的自定义类型的对象一起使用,至少应有一个是类对象,即不允许参数全部是 C的标
43、准类型。故本题答案为 C。 22 【正确答案】 D 【试题解析】 本题考查函数调用及传值方式传递参数,执行函数: function时,并没有将 3的值传回来,而 val又没有初始化 ,所以会输出一个不确定的值, D选项正确。 23 【正确答案】 B 【试题解析】 本题考查复制构造函数,在以下 3种情况下使用: 程序中需要新建立一个对象,并用另一个对象对它初始化; 函数的参数为类的对象; 函数的返回值是类的对象。其中 B选项是由赋值运算符重载实现的。 24 【正确答案】 B 【试题解析】 类的成员访问权限有 3种: public(公用 )、 protected(保护 )、private(私有 )
44、。 25 【正确答案】 A 【试题解析】 本题考查常对象的基本知识,常对象只能调用 它的常成员函数,而不能调用非 const函数,常对象的成员函数不一定都是常成员函数,只需保证其数据成员是常数据成员即可。所以本题选 A。 26 【正确答案】 D 【试题解析】 私有继承方式为基类的公用成员和保护成员在派生类中成了私有成员,其私有成员仍为基类私有,但派生类对象可以访问基类的保护成员,所以基类对象不能赋值给派生类对象。抽象类是指含有纯虚拟函数的类,所以选项 D正确。 27 【正确答案】 B 【试题解析】 本题考查公用继承对基类成员的访问属性。在公用继承中,基类的公用成员和保护成员在 派生类中保持原有
45、的访问属性,其私有成员仍为基类私有。所以本题答案为 B。 28 【正确答案】 B 【试题解析】 本题考查公用继承对基类成员的访问属性。在公用继承中,基类的公用成员和保护成员在派生类中保持原有的访问属性,其私有成员仍为基类私有。本题中想要输出 Base fun,则必须调用基类的公用成员函数 fun,所以使用Base fun( );来调用基类的成员函数 fun。 29 【正确答案】 D 【试题解析】 构造函数和析构函数的调用顺序为先构造的后析构,后构造的先析构。所以本题答案为 D。 30 【正确答案】 A 【试题解析】 本题考查构造函数、常成员函数和静态数据成员。外部同名的变量赋值,不能改变类的静态变量值,所以 Fun对象里的 i值为 2,所以本题答案为A。 31 【正确答案】 D 【试题解析】 本题考查构造函数和析构函数的调用顺序,调用顺序为先构造的后析构,后构造的先析构。本题中先定义了一个对象 ob1,会执行构造函数,那么 i就变为了 1;再执行函数 f后,由于又定义了一个对象 ob2,所以再次执行构造函数, i就变为了 2,输出了 2。函数执行完后执行析构函数, i变为了 1,然后又定义 了对象指针, i变为了 2。释放 ob3后, i变为了 1,所以答案为 D。 32 【正确答案】 B 【试题解析】 本题考查常对象、常成员函数及构造函数。常对象只能调用常成员函数,所以