首页 > 代码库 > c++复习题
c++复习题
(1)标准输入流cin:istream类的对象。(2)标准输出流cout:ostream类的对象。
(3)非缓冲型标准出错流cerr:ostream类的对象。(4)缓冲型标准出错流clog:ostream类的对象
(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类中有两个参数的函数的一个指针。
P=Test::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++复习题