首页 > 代码库 > c++复习题

c++复习题

(1)标准输入流cin:istream类的对象。(2)标准输出流cout:ostream类的对象。

(3)非缓冲型标准出错流cerrostream类的对象。(4)缓冲型标准出错流clogostream类的对象

 

(10)下列关于虚基类的描述,错误的是

A)设置虚基类的目的是为了消除二义性

B)虚基类的构造函数在非虚基类之后调用

C)若同一层中包含多个虚基类,这些虚基类的构造函数按它们说明的次序调用

D)若虚基类由非虚基类派生而来,则仍然先调用基类构造函数,再调用派生类的构造函数

 

 

extern用于声明外部变量的register声明寄存器类型变量

 

多态性有两种静态多态性和动态多态性,静态多态性是指调用同名函数,由于参数

的不同调用不同的同名函数;动态多态性是指不同对象调用同名函数时,由于对象不同调用不同

的同名函数。 多态性肯定具有相同的函数名

 

派生类的成员一个是来自基类,一个来自本身,所以派生类是基类的扩展,也是基

类的具体化和特殊化,派生类是对基类扩展

 

substr取子字符串,第1个参数表示要截取子串在字符串中的位置,第2个表示取多少个字符。

 

要输出this->x=x表达式的值要加括号。

[修改]cout<<this->x=x<<endl;

 

#include <iostream.h>

class Test

{int x,y;

public:

Test(int i,int j=0)

{x=i;y=j;}

int get(int i,int j)

{return i+j;}

};

void main()

{Test t1(2),t2(4,6);

int (Test::*p)(int,int=10);

p=Test::get;

cout<<(t1.*p)(5)<<endl;

Test *p1=&t2;

cout<<(p1->*p)(7,20)<<endl;

}

答案:15  27

[解析]指向类成员函数的指针的使用,*p指向Test类中有两个参数的函数的一个指针。

PTest::get.这样p就和get发生了联系。(t1.*p)(5)等价于调用一个参数的get函数。

 

9. 基类的公有成员在派生类中的访问权限由___决定。

答案:访问控制方式或继承方式

 

13. 类模板用来表达具有___的模板类对象集。

答案:相同处理方法

[解析]模板特点是不同的数据具有相同的处理方法的抽象。

14. C++程序的源文件扩展名为___。

答案:cpp

[解析]源程序*.cpp,目标文件为*.obj,可执行程序*.exe

15. 在#include命令中所包含的头文件,可以是系统定义的头文件,也可以是___的头文件。

答案:自定义

[解析]include装入文件有两种方式<>和“”,一是系统的,一是自定义文件。

 

#include <iostream.h>

void main()

{ int *p1;

int **p2=&p1;

int b=20;

p1=&b;

cout<<**p2<<endl;

}

答案:20

[解析]p1指向b,而p指向p1的地址。*p2表示p1的地址,p1的地址就是&b,即*p2是&b,所以

**p2就是b变量的值。

 

#include <iostream>

#include <string.h>

using namespace std;

class mystring

{public:

char * pdata;

mystring(int len)

{pdata=http://www.mamicode.com/new char[len+1];

}

~mystring()

{delete pdata;}

void show(){cout<<pdata<<endl;}

};

void fun(mystring** array,int len)

{mystring*old=*array;

_______;

memcpy(*array, old, len);

}

void main()

{mystring str(20);

mystring*pstr=&str;

mystring**ppstr=&pstr;

strcpy(str.pdata,"hello,andylin");

fun(ppstr, 20);

_______

}

答案:*array=new mystring(len);,(**ppstr).show();或str.show();

[解析]调用mystring类的构造函数开辟空间,后进行字符的复制。输出可以直接使用str或者

使用二级指针。

 

 

#include <iostream>

#include <string>

using namespace std;

template<class T>

void Swap(T& a,T& b)

{T temp;

 temp=a,a=b,b=temp;

}

void main()

{int a=5,b=9;

char s1[]="Hello",s2[]="hi";

Swap(a,b);

Swap(s1,s2);

cout<<"a="<<a<<",b="<<b<<endl;

cout<<"s1="<<s1<<",s2="<<s2<<endl;

}

答案:char s1[]="Hello",s2[]="hi";使用Swap(s1,s2)调用交换的是地址。字符指针作实

参,形参值发生改变,实参也就发生变化。

 [修改]char *s1="Hello",*s2="hi";

 

ios::binary,采用二进制形式ios::app定位到文件尾部。

 

 对于int *pa[5];的描述,正确的是()

A. pa是一个指向数组的指针,所指向的数组是5个int型元素

B. pa是一个指向某个数组中第5个元素的指针,该元素是int型变量

C. pa[5]表示某个数组的第5个元素的值

D. pa是一个具有5个元素的指针数组,每个元素是一个int型指针

答案:D

解析:指针数组:数组元素都是相同类型的指针,相同类型的指针是说指针所指向的对象

类型是相同的。例如,语句int *pa[5];定义了一个指针数组。在指针数组的定义中有两个运

算符:*和[],运算符[]的优先级高于*,所以*pa[5]等价于*(pa[5]),pa[5]表示一

个数组,而*表示后面的对象为指针变量,合在一起*pa[5]表示一个指针数组。该数组包含5个

元素,每个元素都是指向int型的指针。所以选择D选项。

 

3. 设类A有成员函数void f(void);若要定义一个指向类成员函数的指针变量pf来指向f,该

指针变量的声明语句是:___。

答案:void (A::*pf)(void)=&A::f;

[解析]void(A::*pf)(void)=&A::f;指向成员函数的指针,它相当于两条语句

:void(A::*pf)(void);和pf=&A::f;。

 

重载的运算符保持其原有的___、优先级和结合性不变。

答案:操作数

 

istream和ostream的直接基类是ios。

 

定义向量列表vector<int>A(10,1),使用两个参数,10表示长度,1表示数值。

 

 在C++中有两种参数传递方式:传值和___。

答案:传引用

[解析](1)传值调用又分为数据传值调用和地址传值调用。

 

#include <iostream.h>

void main()

{int a,b,c;

char ch;

cin>>a>>ch>>b>>c;//从键盘上输入1.5×c×10×20,×表示一个空格

cout<<a<<endl<<ch<<endl<<b<<endl<<c<<endl;

}

答案:1

.

5

0

[解析]使用cin进行输入字符的输入的问题。1-->a,.-->ch,5-->b,空格转换为零给了c。

 

 函数调用func((exp1,exp2),(exp3,exp4,exp5))中所含实参的个数为()

A. 1

B. 2

C. 4

D. 5

答案:B

解析:(exp1,exp2)、(exp3,exp4,exp5)表示是两个逗号表达式,值是最后一个值,相当于两个

参数。因此实参的个数是2。

 

普通成员函数可以调用静态函数,相反静态函数不能调用普通成员函数,这与普通

函数与常成员函数相同。

 

13. 在编译指令中,宏定义使用哪个指令()

A. #if

B. #include

C. #define

D. #error

答案:C

解析: #if条件编译,#include文件包含,#error错误处理。

 

:除了类属关系运算符"."、成员指针运算符".*"、作用域运算符"::"、sizeof运算

符和三目运算符"?:"以外,C++中的所有运算符都可以重载。

 

20. 在C++语言中,数据封装要解决的问题是()

A. 数据的规范化

B. 便于数据转换

C. 避免数据丢失

D. 防止不同模块之间数据的非法访问

答案:D

解析:封装是指把对象属性和操作结合在一起,构成独立的单元,它的内部信息对外界是

隐蔽的,不允许外界直接存取对象的属性,只能通过有限的接口与对象发生联系。类是数据封装

的工具,对象是封装的实现。类的访问控制机制体现在类的成员中可以有公有成员、私有成员和

保护成员。对于外界而言,只需要知道对象所表现的外部行为,而不必了解内部实现细节。封装

体现了面向对象方法的“信息隐蔽和局部化原则”。

 

 C++派生类使用两种基本的面向对象技术:第一种称为性质约束,即对基类的性质加以限制

;第二种称为___,即增加派生类的性质。

答案:性质扩展

[解析]派生类通过继承可以从基类中获得成员,也可以自定义成员。

 

6. 面向对象的四个基本特性是多态性、继承性、和封装性___。

答案:抽象

 

答案:(*this).x=x; (*this).y=y;,cout<<x<<"+"<<y<<"="<<x+y<<endl;

[解析]形参同数据成员同名,使用this来访问。

 

#include<iostream.h>

class a

{public:

a(int i=10){x=i;cout<<"a:"<<x<<endl;}

int x;

};

class b:public a

{public:

b(int i):A(i){x=i;cout<<"b:"<<x<<", "<<a::x<<endl;}

private:

a A;

int x;

};

void main()

{b B(5);

}

答案:a:10

a:5

b:5,10

[解析]定义对象B,先调用基类构造函数,在b构造函数中使用的是A(i),注意大小写,不

是a(i),也就是说调用基类的构造函数时没有实参值,所以采用默认值;在初始化类成员A,即

A(i),i=5,所以输入为a:5;最后是b类的构造函数,x=5,来自基类x=10,输出b:5,10。

 

(1)全局变量:在函数外部定义的变量称为全局变量,其作用域为:从定义变量的位置开始

到源程序结束。全局变量增加了函数之间数据联系的渠道,全局变量作用域内的函数,均可使用

、修改该全局变量的值,但是使用全局变量降低了程序的可理解性,软件工程学提倡尽量避免使

用全局变量。

(2)局部变量:在函数内部定义的变量称为局部变量,其作用域为:从定义变量的位置开始

到函数结束。局部变量包含自动变量(auto)静态变量(static)以及函数参数。

auto变量意味着变量的存储空间的分配与释放是自动进行的。说明符auto可以省略。函数中

的局部变量存放在栈空间。在函数开始运行时,局部变量被分配内存单元,函数结束时,局部变

量释放内存单元。因此,任两个函数中的局部变量可以同名,因其占有不同的内存单元而不影响

使用。这有利于实现软件开发的模块化。

static变量是定义在函数体内的变量,存放在静态存储区,不用栈空间存储,其值并不随存

储空间的释放而消失。

 

运算符的重载,前缀先让变量变化。调用++a,等价为a.operator++(),注意无参

的形式。后缀的话a++,等价于a.operator(0),带形参,形参名可省。

 

8. 解决定义二义性问题的方法有()

A. 只能使用作用域分辨运算符

B. 使用作用域分辨运算符或成员名限定

C. 使用作用域分辨运算符或虚基类

D. 使用成员名限定或赋值兼容规则

答案:B

解析:解决二义性问题主要要两种方法:(1)赋值兼容规则;(2)虚基类。

 

cin、cout、cerr和clog中cin用于输入,cout用于输出,cerr、clog错误处理。

 

int a=32;

double c=32;

cout.setf(ios::hex);

cout<<"hex:a="<<a<<",c="<<c<<endl;

cout.unsetf(ios::hex);

程序的输出结果为___。

答案: hex:a=20,c=32

[解析]用十六进制只能输出整型数据,而不能将其它类型数据转换成十六进制的数据输出。所

以double类型不变仍然是32(double类型)。

 

类成员包括成员函数和数据成员,都可以使用访问权限public、private和protected来修

饰,而普通的变量不能使用访问权限来说明。

 

10. 下列有关模板和继承的叙述正确的是 ()

A. 模板和继承都可以派生出一个类系

B. 从类系的成员看,模板类系的成员比继承类系的成员较为稳定

C. 从动态性能看, 继承类系比模板类系具有更多的动态特性

D. 相同类模板的不同实例一般没有联系,而派生类各种类之间有兄弟父子等关系

答案:D

解析:类是相同类型事物的抽象,具有不同的操作。而模板是不同类型的事物,具体相同

的操作的抽象。类模板的实例化后,各个对象没有任何关系。而类对象是通过派生、继承等关系

的关系。

 

13. 类模板用来表达具有___的模板类对象集。

答案:相同处理方法

[解析]模板特点是不同的数据具有相同的处理方法的抽象。

14. 如果通过同一个基类派生一系列的类,则将这些类总称为___。

答案:类族

[解析]单继承方式派生的众多的类。

15. 面向对象的四个基本特性是多态性、继承性、和封装性___。

答案:抽象

 

string str("HelloC++");

cout<<str.substr(5,3);

程序的输出结果是___。

答案: C++

c++复习题