答案:(P117)void (A::*pf)(void)=&A::f;
[解析]void(A::*pf)(void)=&A::f;指向成员函数的指针,它相当于两条语句 :void(A::*pf)(void);和pf=&A::f;。 4. 执行下列程序
double a=3.1415926,b=3.14;
cout< [解析]题目设置精度即有效数字都是5,a四舍五入是3.1416,b是3.14。 5. vector类中用于删除向量中的所有对象的方法是___。 答案:clear() [解析]向量的使用。返回向量中对象的方法有:front()back()operator[],在向量中删 除对象的方法pop_back erase clear。 6. 重载的运算符保持其原有的___、优先级和结合性不变。 答案:操作数 [解析]运算符重载时要遵循以下规则: (1)除了类属关系运算符“.”、成员指针运算符“.*”、作用域运算符“::”、sizeof运算符 和三目运算符“?:”以外,C++中的所有运算符都可以重载。 (2)重载运算符限制在C++语言中已有的运算符范围内的允许重载的运算符之中,不能创建新的 运算符。 (3)重载之后的运算符不能改变运算符的优先级和结合性,也不能改变运算符操作数的个数及 语法结构。 7. 编译时的多态性通过___函数实现。 答案:重载 [解析]编译多态性,实现的方法主要通过函数的重载或运算符的重载。 8. 基类的公有成员在派生类中的访问权限由___决定。 答案:访问控制方式或继承方式 9. 假设类X的对象x是类Y的成员对象,则“Y Obj”语句执行时,先调用类___的构造函数。 答案:X [解析]派生类中的构造函数的执行顺序,先基类后派生类。 10. 下列程序段的输出结果是___。 cout.setf(ios::showpos); cout<<509.3< 答案:(P193)+509.3 [解析]输入、输出格式ios::showpos用于输出数据的符号位。 11. 下列程序段的输出结果是___。 for(i=0,j=10,k=0;i<=j;i++,j-=3,k=i+j);cout< [解析]for循环结构,三个表达式的作用,初始化、循环判断条件和循环变量变化。循环执行了 三次,k的作用是计算i、j的和。 12. C++中ostream的直接基类___。 答案:ios [解析]istream和ostream的直接基类是ios。 13. int n=0; while(n=1)n++; while循环执行次数是___。 答案:无限次 [解析]=是赋值运算符,不是关系运算符,且不等0,所以死循环。 14. C++中有两种继承:单继承和___。 答案:多继承 [解析]单继承和多继承,多继承即有多个基类。 15. 在C++中,利用向量类模板定义一个具有10个int的向量A,其元素均被置为1,实现此操作 的语句是___。 答案:vector [解析]定义向量列表vector 17. C++语言中如果调用函数时,需要改变实参或者返回多个值,应该采取___方式。 答案:传地址或引用 [解析]传地址即指针,在函数中通过指针修改它指向的变量的值时,实参也就变化了。使用引 用,直接修改变量的别名即引用的值,该变量也就随着变化。 18. 若函数的定义处于调用它的函数之前,则在程序开始可以省去该函数的___语句。 答案:声明 [解析]函数使用有两部分:声明和定义。定义在前,可以无声明;但函数定义在后,调用在前 的话,需要先声明函数的原型。 19. 在C++中有两种参数传递方式:传值和___。 答案:传引用 [解析](1)传值调用又分为数据传值调用和地址传值调用。(2)引用调用是将实参变量值传 递给形参,而形参是实参变量的引用名。引用是给一个已有变量起的别名,对引用的操作就是对 该引用变量的操作。 20. 将指向对象的引用作为函数的形参,形参是对象的引用,实参是 ___。 答案:对象名 [解析]实参与形参类型要一致,形参是对象的引用,实参应该是对象名。 三、改错题(本大题共5小题,每小题4分,共20分) 1. class ABC {int a; public: ABC(int aa)a(aa){} }; 答案:ABC(int aa)a(aa){}初始化列表格式错误。 [修改]ABC(int aa):a(aa){} 2. #include void init(int i,int j){zx=i;zy=j;} Aton(int i,int j,int n=0,int m=0) {X=i,Y=j,zx=m,zy=n; } }; void main() {Aton A(25,20,3,5); A.init(5,9); cout< 答案:int X,Y;因为X,Y都是私有的,在类外无法直接访问。 [修改]public:int X,Y; 3. #include ~Bas(){cout<<\virtual void f()=0; }; class Dev:public Bas {public: ~Dev(){cout<<\virtual void f(){cout<<\}; void main() {Bas *a=new Bas(); Dev p; a=&p; a->f(); } 答案:[修改]Bas *a; [解析]Bas *a=new Bas();抽象类不能被实例化,但可以声明指针或引用,所以不能用new,因 为new产生临时对象。 4. 以下程序实现交换a,b变量的值,请用下横线标出错误所在行并给出修改意见。 #include a=a-b; } void main() {int a=19,b=15; cout<<\swap(&a,&b); cout<<\} 答案:swap(&a,&b);函数的形参是变量的引用,调用时的实参应该是地址。 [修改]swap(a, b); 5. #include cout<<*p< 答案:int * const p=&i;在指针变量前加const表示一个常指针即地址不能变化,它指向的变 量不能改变且定义时必须设置指向变量或对象的地址。 [修改]int *p=&i; 四、完成程序题(本大题共5小题,每小题4分,共20分) 1. 在下面程序横线处填上适当内容,使程序执行结果为:\。 #include char * pdata; mystring(int len) {pdata=new char[len+1]; } ~mystring() {delete pdata;} void show(){cout< void fun(mystring** array,int len) {mystring*old=*array; _______; memcpy(*array, old, len); } void main() {mystring str(20); mystring*pstr=&str;