1、二级 C+-234 及答案解析(总分:57.50,做题时间:90 分钟)一、选择题(总题数:36,分数:57.50)1.下列关于赋值运算符“=”重载的叙述中,正确的是(分数:2.00)A.赋值运算符只能作为类的成员函数重载B.默认的赋值运算符实现了“深层复制”功能C.重载的赋值运算符函数有两个本类对象作为形参D.如果己经定义了复制(拷贝)构造函数,就不能重载赋值运算符2.若有如下语句 #includeiostream.h void main() int x=3; do x=x-2; coutx; while(!(-x); 则上面程序段_。(分数:2.50)A.输出的是 1B.输出的是 1 和-
2、2C.输出的是 3 和 0D.是死循环3.若有如下定义和语句: int s45,(*p)5; p=S; 则指针对 s 数组中第三个元素的正确引用形式是 _ 。(分数:2.00)A.p03B.p12C.p02D.p134.有如下程序: #includeiostream using namespace std; int main() void function(double val): double val; function(val); coutval; retum0; void function(double val) val=3; 编译运行这个程序将出现的情况是_。(分数:1.00)A.编译
3、出错,无法运行B.输出:3C.输出:3.0D.输出一个不确定的数5.有如下程序段: int i=2; do i*=i; cout“#“; if(i1000)break; while(1); 运行这个程序段时,输出字符“#“的个数是_。(分数:2.50)A.3B.4C.5D.66.有如下语句序列: char str10;cinstr; 当从键盘输入“I love this game”时,str 中的字符串是_。(分数:2.50)A.“I love this game“B.“I love thi“C.“I love“D.“I“7.有以下语句,则对 a 数组元素的引用不正确的是(0i9) int a
4、10=0,1,2,3,4,5,6,7,8,9,*p=a;(分数:1.00)A.ap=a)B.*( MyClass() private: int data; ; 下列对 MyClass 类对象数组的定义和初始化语句中,正确的是_。(分数:1.00)A.MyClass array2;B.MyClass array2=MyClass(5);C.MyClass array2=MyClass(5),Myclass(6);D.MyClass*array=new MyClass2;10.已知 Value 是一个类,value 是 Value 的一个对象。下列以非成员函数形式重载的运算符函数原型中,正确的是_
5、。(分数:1.00)A.Value operator+(Value v,int i);B.Value operator+(Value V=value,int i);C.Value operator+(Value v,int i=0);D.Value operator+(Value V=value,int i=0);11.下列关于队列的叙述中正确的是(分数:1.00)A.在队列中只能插入数据B.在队列中只能删除数据C.队列是先进先出的线性表D.队列是先进后出的线性表12.有如下程序: #includeiost ream using namespace std; class XA int a; p
6、ublic: static int b; XA(int aa):a(aa)b+; XA() int get()return a; ; int XA:b=0 int main() XA d1(1),d2(3); coutd1.get+d2.get+XA:bendl; return 0; 运行时的输出结果是_。(分数:1.00)A.5B.6C.7D.813.关于数据库系统三级模式的说法,下列 _ 是正确的。(分数:2.00)A.外模式、概念模式、内模式都只有一个B.外模式有多个,概念模式和内模式只有一个C.外模式只有一个,概念模式和内模式有多个D.3 个模式中,只有概念模式才是真正存在的14.关于
7、关键字 class 和 typename,下列表述中正确的是_。(分数:1.00)A.程序中的 typename 都可以替换为 classB.程序中的 class 都可以替换为 typenameC.在模板形参表中只能用 typename 来声明参数的类型D.在模板形参表中只能用 class 或 typename 来声明参数的类型15.一个工作人员可以使用多台计算机,而一台计算机可被多个人使用,则实体工作人员与实体计算机之间的联系是_。(分数:1.00)A.-对一B.一对多C.多对多D.多对一16.针对数组定义 int data10;,下列表述中错误的是(分数:1.00)A.用*data 可访问
8、到数组的首元素B.用 data9可访问到数组的末元素C.用 data10访问数组元素会超出数组边界D.data 共有 10 个元素,其首元素是 data117.对于一个类定义,下列叙述中错误的是_。(分数:2.50)A.如果没有定义拷贝构造函数,编译器将生成一个拷贝构造函数B.如果没有定义缺省的构造函数,编译器将一定生成一个缺省的构造函数C.如果没有定义构造函数,编译器将生成一个缺省的构造函数和一个拷贝构造函数D.如果已经定义了构造函数和拷贝构造函数,编译器不会生成任何构造函数18.下面关于 this 指针的说法中错误的是 _ 。(分数:2.00)A.this 指针是一种隐含指针,存在于每个类
9、的非静态成员函数中B.它是成员函数所属对象的指针C.通过 this.成员变量的形式可以访问类中的数据成员D.成员函数访问类中的数据成员格式可写成:this-成员变量19.若已定义; inta=0,1,2,3,4,5,6,7,8,9,*p=a,i; 其中 0i=9,则对 a 数组元素不正确的引用是 _ 。(分数:2.00)A.ap-aB.x(,则数组 x 在内存中所占字节数是(分数:2.00)A.3B.6C.10D.2021.下列有关内联函数的叙述中,正确的是(分数:1.00)A.内联函数在调用时发生控制转移B.内联函数必须通过关键字 inline 来定义C.内联函数足通过编译器来实现的D.内联
10、函数函数体的最后一条语句必须是 return 语句22.由于常对象不能被更新,因此_。(分数:1.00)A.通过常对象只能调用它的常成员函数B.通过常对象只能调用静态成员函数C.常对象的成员都是常成员D.通过常对象可以调用任何不改变对象值的成员函数23.有如下程序 #includeiostream.h void main() char ch25=“6937“,“8254“,*p2; int i,j,s0; for(i0;i(2;i+)pichi; for(i0;i(2;i+) for(j0;pij“/0,j+2) s10*s+pij-“0“; couts; 该程序的输出结果是 _ 。(分数:2
11、.00)A.69825B.63825C.6385D.69382524.在深度为 7 的满二叉树中,叶子结点的个数为 _ 。(分数:2.00)A.32B.31C.64D.6325.下列关于函数模板的描述中,正确的是_。(分数:1.00)A.函数模板是一个实例函数B.使用函数模板定义的函数没有返回类型C.函数模板的类型参数与函数的参数相同D.通过使用不同的类型参数,可以从函数模板得到不同的实例函数26.有以下程序: #include iostream using namespace std; int main() int num23,*p; int t,i,j,k=10; p=num0; for(
12、i=0;i2;i+) for(j=0;j3;j+) k+; *p=k; for(t=2;t*p;t+) if(!(*pt) j-; *p-; break; *p+; cout*(p-1)end1; return 0; 程序运行后的输出结果是 _ 。(分数:1.00)A.19B.11C.29D.2327.下列不属于软件设计阶段任务的是_。(分数:2.50)A.软件总体设计B.算法设计C.制定软件确定测试计划D.数据库设计28.有如下类声明: class Foo int bar; ; 则 Foo 类的成员 bar 是(分数:2.00)A.公有数据成员B.公有成员函数C.私有数据成员D.私有成员函数
13、29.将前缀运算符“- -”重载为非成员函数,下列原型中能正确用于类中说明的是_。(分数:1.00)A.DecrB.Decr operator -(DecrC.friend DecrD.friend Decr operator -(Decr30.下列叙述中正确的是_。(分数:1.00)A.有一个以上根结点的数据结构不一定是非线性结构B.只有一个根结点的数据结构不一定是线性结构C.循环链表是非线性结构D.双向链表是非线性结构31.下列程序执行结果是_。 #includeiostream.h class A public; int a; A():a(10)coutaend1; ; void mai
14、n() A obj1; A obj2(obj1); cout“ “obj2.aend1; (分数:2.50)A.10 10B.编译错误 缺少拷贝构造函数C.10 随机数D.随机数 随机数32.下列控制格式输入/输出的操作符中,能够设置浮点数精度的是_。(分数:1.00)A.setprecisionB.setwC.setfillD.showpoint33.有以下类定义 class MyClass public: MyClass() cout1; ; 则执行语句 MyClass a,b 2,*p2;后,程序的输出结果是 _ 。(分数:2.00)A.11B.111C.1111D.1111134.将
15、x+y*z 中的“+”用成员函数重载,“*”用友元函数重载应写为_。(分数:2.50)A.operator+(operator*(y,z)B.operator+(operator*(y,z)C.operator+(x*(y,z)D.x+(operator*(y,z)35.若有如下程序: #includeiostream using namespace std; int s=0; class sample static int n; public: sample(int i) n=i; static void add() S+=n; ; int sample:n=0; int main() sa
16、mple a(2),b(5); sample:add(); coutsendl; return 0; 程序运行后的输出结果是 _ 。(分数:2.00)A.2B.5C.7D.336.有如下类定义: class Bag public: Bag(int p=200, char s=“M“):price(p), size(s) coutsize; private: int price; char size; ; 若执行语句 Bag Alice, Kelly(Mice), *Twins2, F44; 则输出结果为_。(分数:1.00)A.MMMMMMMMB.MMMMMMC.MMMMMD.MMMM二级 C
17、+-234 答案解析(总分:57.50,做题时间:90 分钟)一、选择题(总题数:36,分数:57.50)1.下列关于赋值运算符“=”重载的叙述中,正确的是(分数:2.00)A.赋值运算符只能作为类的成员函数重载 B.默认的赋值运算符实现了“深层复制”功能C.重载的赋值运算符函数有两个本类对象作为形参D.如果己经定义了复制(拷贝)构造函数,就不能重载赋值运算符解析:2.若有如下语句 #includeiostream.h void main() int x=3; do x=x-2; coutx; while(!(-x); 则上面程序段_。(分数:2.50)A.输出的是 1B.输出的是 1 和-2
18、 C.输出的是 3 和 0D.是死循环解析:解析 do.while 语句的一般格式为“do 循环体语句 while(表达式);”,先执行循环体语句一次,再判断表达式的值,若为真则继续执行循环,否则终止循环。本题中,先执行 x=x-2,即为 1。判断表达式的值,!(-x)为真,x=0,继续循环。再次执行循环体语句后,x=-2,此时表达式的值为 0,结束循环。3.若有如下定义和语句: int s45,(*p)5; p=S; 则指针对 s 数组中第三个元素的正确引用形式是 _ 。(分数:2.00)A.p03B.p12C.p02 D.p13解析:解析 “p=s;”语句将指针 p 指向数组 s。而数组为
19、二维数组,下标标识由 0 开始,所以第二个元素为下标为 0 行的 2 列,即 p02。4.有如下程序: #includeiostream using namespace std; int main() void function(double val): double val; function(val); coutval; retum0; void function(double val) val=3; 编译运行这个程序将出现的情况是_。(分数:1.00)A.编译出错,无法运行B.输出:3C.输出:3.0D.输出一个不确定的数 解析:解析 本题考查函数调用及传值方式传递参数,执行函数 fun
20、ction 时,并没有将 3 的值传回来,而 val 又没有初始化,所以会输出一个不确定的值,D 选项正确。5.有如下程序段: int i=2; do i*=i; cout“#“; if(i1000)break; while(1); 运行这个程序段时,输出字符“#“的个数是_。(分数:2.50)A.3B.4 C.5D.6解析:解析 本题考查的是程序执行的相关知识。i*=i 等价于 i=i*i,第一次循环,i=4 时,输出第一个“#“,此时 i 不大于 1000,循环继续,第二次循环,i=16 时,输出第二个“#“,此时不大于 1000,循环继续,第三次循环,i=256 时,输出第三个“#“,此
21、时不大于 1000,循环继续,第四次循环,i=65536 时,输出第四个“#“,此时 i 大于 1000,循环停止,跳出循环,故输出四个“#“,选择 B。6.有如下语句序列: char str10;cinstr; 当从键盘输入“I love this game”时,str 中的字符串是_。(分数:2.50)A.“I love this game“B.“I love thi“C.“I love“D.“I“ 解析:解析 cin 是 C+预定义的标准输入流对象,cin 用来接收字符串时,遇“空格”、“TAB”和“回车”时都会结束。故答案为 D 选项。7.有以下语句,则对 a 数组元素的引用不正确的是
22、(0i9) int a10=0,1,2,3,4,5,6,7,8,9,*p=a;(分数:1.00)A.ap=a)B.*( MyClass() private: int data; ; 下列对 MyClass 类对象数组的定义和初始化语句中,正确的是_。(分数:1.00)A.MyClass array2;B.MyClass array2=MyClass(5);C.MyClass array2=MyClass(5),Myclass(6); D.MyClass*array=new MyClass2;解析:解析 A 只是声明,没有初始化;B 的初始化错误,另一个数组对象没有指明地址;D 同样做的不是初始
23、化的事情。10.已知 Value 是一个类,value 是 Value 的一个对象。下列以非成员函数形式重载的运算符函数原型中,正确的是_。(分数:1.00)A.Value operator+(Value v,int i); B.Value operator+(Value V=value,int i);C.Value operator+(Value v,int i=0);D.Value operator+(Value V=value,int i=0);解析:解析 本题考查运算符重载,其中重载运算符的函数不能有默认的参数,所以本题答案为 A。11.下列关于队列的叙述中正确的是(分数:1.00)A
24、.在队列中只能插入数据B.在队列中只能删除数据C.队列是先进先出的线性表 D.队列是先进后出的线性表解析:解析 队列是指允许在一端进行插入、而在另一端进行删除的线性表,选项 A 和选项 B 错误。允许插入的一端称为队尾,允许删除的一端称为队头。在队列中,最先插入的元素将最先能够被删除,反之,最后插入的元素将最后才能被删除。所以,队列又称为“先进先出”或“后进后出”的线性表,它体现了“先来先服务”的原则,选项 C 正确,选项 D 错误。12.有如下程序: #includeiost ream using namespace std; class XA int a; public: static i
25、nt b; XA(int aa):a(aa)b+; XA() int get()return a; ; int XA:b=0 int main() XA d1(1),d2(3); coutd1.get+d2.get+XA:bendl; return 0; 运行时的输出结果是_。(分数:1.00)A.5B.6C.7 D.8解析:解析 每调用一次 get 函数时,对新的类 A 对象进行一次实例化,调用一次构造函数,类 A 的静态成员变量 b 便加 1。13.关于数据库系统三级模式的说法,下列 _ 是正确的。(分数:2.00)A.外模式、概念模式、内模式都只有一个B.外模式有多个,概念模式和内模式只
26、有一个 C.外模式只有一个,概念模式和内模式有多个D.3 个模式中,只有概念模式才是真正存在的解析:14.关于关键字 class 和 typename,下列表述中正确的是_。(分数:1.00)A.程序中的 typename 都可以替换为 class B.程序中的 class 都可以替换为 typenameC.在模板形参表中只能用 typename 来声明参数的类型D.在模板形参表中只能用 class 或 typename 来声明参数的类型解析:解析 此题考查的是 class 和 typename 两个关键字。关键字 class 除了能用来定义类以外还能用来声明模板的虚拟类型参数。在用作声明虚拟
27、类型参数时 typename 与 class 可以互换,但不能使用typename 来定义类;在模板形参表中除了可以用 typename 和 class 声明虚拟类型参数外,还可以使用普通类型声明常规函数,故选项 C 错误。15.一个工作人员可以使用多台计算机,而一台计算机可被多个人使用,则实体工作人员与实体计算机之间的联系是_。(分数:1.00)A.-对一B.一对多C.多对多 D.多对一解析:解析 因为一个人可以操作多个计算机,而一台计算机又可以被多个人使用,所以两个实体之间是多对多的关系。16.针对数组定义 int data10;,下列表述中错误的是(分数:1.00)A.用*data 可访
28、问到数组的首元素B.用 data9可访问到数组的末元素C.用 data10访问数组元素会超出数组边界D.data 共有 10 个元素,其首元素是 data1 解析:17.对于一个类定义,下列叙述中错误的是_。(分数:2.50)A.如果没有定义拷贝构造函数,编译器将生成一个拷贝构造函数B.如果没有定义缺省的构造函数,编译器将一定生成一个缺省的构造函数 C.如果没有定义构造函数,编译器将生成一个缺省的构造函数和一个拷贝构造函数D.如果已经定义了构造函数和拷贝构造函数,编译器不会生成任何构造函数解析:18.下面关于 this 指针的说法中错误的是 _ 。(分数:2.00)A.this 指针是一种隐含
29、指针,存在于每个类的非静态成员函数中B.它是成员函数所属对象的指针C.通过 this.成员变量的形式可以访问类中的数据成员 D.成员函数访问类中的数据成员格式可写成:this-成员变量解析:解析 this 指针是一个隐含指针,它隐含于每个类的非静态成员函数中。this 指针是成员函数所属的对象指针,它指向当前类的对象地址。通过 this 指针访问当前对象成员有两种方式:(*this).成员,this-成员。19.若已定义; inta=0,1,2,3,4,5,6,7,8,9,*p=a,i; 其中 0i=9,则对 a 数组元素不正确的引用是 _ 。(分数:2.00)A.ap-aB.x(,则数组 x
30、 在内存中所占字节数是(分数:2.00)A.3B.6C.10D.20 解析:解析 x 数组共有 10 个元素,在花括号内只提供 3 个初值,这表示只给前面的 3 个成员赋值,后7 个元素的值为 0,所以,一共有 20 个字节。21.下列有关内联函数的叙述中,正确的是(分数:1.00)A.内联函数在调用时发生控制转移B.内联函数必须通过关键字 inline 来定义C.内联函数足通过编译器来实现的 D.内联函数函数体的最后一条语句必须是 return 语句解析:解析 本题考查了内联函数的概念。在调用的时候,内联函数会像宏函数一样的展开,所以它没有一般函数的参数压栈和退栈操作,所以选项 A 不正确。
31、在 C+中,编译器会将在类的说明部分定义的函数认定为内联函数,即使它们没有用 inline 说明,所以选项 B 不正确。内联函数除了比普通函数有更高的执行效率外,跟普通函数没有任何区别,因此选项 D 也不正确。4 个选项中只有 C 正确。22.由于常对象不能被更新,因此_。(分数:1.00)A.通过常对象只能调用它的常成员函数 B.通过常对象只能调用静态成员函数C.常对象的成员都是常成员D.通过常对象可以调用任何不改变对象值的成员函数解析:解析 本题考查常对象的基本知识,常对象只能调用它的常成员函数,而不能调用非 const 函数,常对象的成员函数不一定都是常成员函数,只需保证其数据成员是常数
32、据成员即可。所以本题选 A。23.有如下程序 #includeiostream.h void main() char ch25=“6937“,“8254“,*p2; int i,j,s0; for(i0;i(2;i+)pichi; for(i0;i(2;i+) for(j0;pij“/0,j+2) s10*s+pij-“0“; couts; 该程序的输出结果是 _ 。(分数:2.00)A.69825B.63825C.6385 D.693825解析:解析 该题主要要搞清楚以下几点:定义了一个指针数组 char *p2后,程序中第一个循环or(i=o;i2,i+)pi=chi;的作用是使指针数组的
33、 p0元素(它本身是一个指针)指向了二维数组ch 的第一行字符串,井使指针数组的 p1元素指向了二维数组 ch 的第二行字符串,这样,就使指针数组p 和二维数蛆 ch 建立起了一种对应关系,以后对二维数组 ch 的某个元素的引用就有两种等价的形式;chij或 Pij。对二维数组 ch 的初始化,使其第一行 ch0中存入了字符串“6937“,第二行ch1中的内容为字符串”8254”。程序中第二个循环中的循环体 s=s。10+pij -“0“;的功能是这样的,每执行一次,将 s 中的值乘以 10(也即,将 s 中的数值整体向左移动一位,并在空出来的个位上添一个 0),再将当前 pij中的字符量转换
34、为相应的数字,然后把这个数字加到 s 的个位上。注意到内层循环的循环条件 pij,“/0“是指 pij中的字符只要不是字符串结束标志“/0“就继续循环,语句j+2;是使下标 j 每次增加 2,也即一个隔一个地从 pi所指向的字符串中取出字符。经过上述解析后,不难看出,该程序首先从 p0所指向的字符串” 6937“中一个隔一个地取出字符,分别是“6“和“3“,然后从 p1所指向的宇符串“8254“,中一个隔一个地取出字符,分别是”“8“和“5“,同时经过转换和相加运算后,结果 s 中的值应该是 6385。24.在深度为 7 的满二叉树中,叶子结点的个数为 _ 。(分数:2.00)A.32B.31
35、C.64 D.63解析:25.下列关于函数模板的描述中,正确的是_。(分数:1.00)A.函数模板是一个实例函数B.使用函数模板定义的函数没有返回类型C.函数模板的类型参数与函数的参数相同D.通过使用不同的类型参数,可以从函数模板得到不同的实例函数 解析:解析 函数模板只是声明了一个函数的描述即模板,不是一个可以直接执行的函数,只有根据实际情况用实参的数据类型参数标识符之后,才能产生真正的函数。26.有以下程序: #include iostream using namespace std; int main() int num23,*p; int t,i,j,k=10; p=num0; for
36、(i=0;i2;i+) for(j=0;j3;j+) k+; *p=k; for(t=2;t*p;t+) if(!(*pt) j-; *p-; break; *p+; cout*(p-1)end1; return 0; 程序运行后的输出结果是 _ 。(分数:1.00)A.19B.11C.29 D.23解析:解析 本题考核数组与指针的关系。程序首先初始化指针 p,让其指向二维数组 num 的首元素,即 num00。程序中,第 1 个 for 循环是为二维数组的每行元素赋值而设置的循环,第 2 个 for 循环是为二维数组的每列元素赋值而设定的,第 3 个 for 循环是为判断数组元素是否是素数而
37、设置的。在第 3个 for 循环中,如果*p 的值能被小于它的数整除(即不是素数),则执行“j-;*p-;”,然后跳出第 3个 for 循环。j-的含义是让其前面的赋值语句重新赋值,而*p-的含义是使指针指向前一个单元。语句“*p+;”将指针移到下一个单元,在下一次循环时,k 加 1,并 k 赋给*p,看*p 是否为素数,这样一直到满足条件为止,即数组 num23中的数都为素数。最后数组 num 中各元素的值分别为大于 10 的素数,即分别为:11,13;17,19,23,29。 程序最后要求输出*p 的值,由于此时指针已指向数组 num 的最后一个元素,即 num12。所以输出的值是 29。
38、27.下列不属于软件设计阶段任务的是_。(分数:2.50)A.软件总体设计B.算法设计C.制定软件确定测试计划 D.数据库设计解析:解析 软件概要设计阶段的任务有:软件系统的结构的设计、数据结构和数据库设计、编写概要设计文档、概要设计文档评审。确认测试是依据需求规格说明书来验证软件的功能和性能,也就是说,确认测试计划是在需求分析阶段就制定了。28.有如下类声明: class Foo int bar; ; 则 Foo 类的成员 bar 是(分数:2.00)A.公有数据成员B.公有成员函数C.私有数据成员 D.私有成员函数解析:解析 本题考核类的定义。在定义类的成员变量时,一般都会加上关键字来修饰
39、其访问权限,其缺省值为私有。29.将前缀运算符“- -”重载为非成员函数,下列原型中能正确用于类中说明的是_。(分数:1.00)A.DecrB.Decr operator -(DecrC.friend DecrD.friend Decr operator -(Decr 解析:解析 非成员函数重载用友元函数的形式实现,“- -”运算符重载分为前置和后置两种重载方式。用友元函数来实现“- -”运算符的重载时,前置“- -”运算符的重载的一般格式为:friendtypeoperator- -(ClassName int a; A():a(10)coutaend1; ; void main() A o
40、bj1; A obj2(obj1); cout“ “obj2.aend1; (分数:2.50)A.10 10 B.编译错误 缺少拷贝构造函数C.10 随机数D.随机数 随机数解析:解析 本题考查拷贝构造函数的知识。如果类中没有实现拷贝构造函数可以完成数据成员的自动赋值,对于复杂对象,则可能需要显式定义拷贝构造函数。32.下列控制格式输入/输出的操作符中,能够设置浮点数精度的是_。(分数:1.00)A.setprecision B.setwC.setfillD.showpoint解析:解析 iomanip 中定义的操纵符包括:setfill(ch)用 ch 填充空白、setprecision(n
41、)将浮点精度置为 n、setw(w)、读写 w 个字符的值 showpoint 设置小数点。33.有以下类定义 class MyClass public: MyClass() cout1; ; 则执行语句 MyClass a,b 2,*p2;后,程序的输出结果是 _ 。(分数:2.00)A.11B.111 C.1111D.11111解析:34.将 x+y*z 中的“+”用成员函数重载,“*”用友元函数重载应写为_。(分数:2.50)A.operator+(operator*(y,z)B.operator+(operator*(y,z) C.operator+(x*(y,z)D.x+(opera
42、tor*(y,z)解析:解析 在定义了重载运算符后的函数后,函数 operator+重载了运算符“+”。如果在类以外的其他地方定义了一个函数,在类体中用 friend 对该函数进行声明,此函数就称为本类的友元函数。“*”用友元函数重载就是运算符函数不作为成员函数,而把它放在类外,“.*”被改写为“operator*”。“+”为成员函数重载,x.operator+。所以“x+y*z”被改写为“x.operator+(operator*(y,z)”。35.若有如下程序: #includeiostream using namespace std; int s=0; class sample stat
43、ic int n; public: sample(int i) n=i; static void add() S+=n; ; int sample:n=0; int main() sample a(2),b(5); sample:add(); coutsendl; return 0; 程序运行后的输出结果是 _ 。(分数:2.00)A.2B.5 C.7D.3解析:解析 执行语句“sample a(2),b(5)”;的结果是使 n 的值最终变为 5,sample:add()语句调用函数 static void add(),使得 s=s+n=5。36.有如下类定义: class Bag publi
44、c: Bag(int p=200, char s=“M“):price(p), size(s) coutsize; private: int price; char size; ; 若执行语句 Bag Alice, Kelly(Mice), *Twins2, F44; 则输出结果为_。(分数:1.00)A.MMMMMMMMB.MMMMMMC.MMMMM D.MMMM解析:解析 首先 Bag Alice 语句,会调用默认构造函数 Bag(int p=200,char s=“M“),输出 size 的值 M;接着 Bag Kelly(Alice)语句会调用编译器生成的复制构造函数,完成初始化,复制构造函数只负责初始化成员变量,没有输出语句;Bag *Twins2定义一个 Bag*类型的数组,包含两个 Bag*类型的元素,并不会构造 Bag 对象,没有输出;而:Bag F44定义了一个 Bag 类型的数组,包含 4 个 Bag 类型的元素,同时这 4 个元素会使用默认构造函数完成初始化,所以调用 Bag(int p=200,char s=“M“),输出 4 个 M。综上,输出结果为 MMMMM,答案为 C 选项。