一、单项选择题
1. 在C++语言中,对函数参数默认值描述正确的是:( )
A) 函数参数的默认值只能设定一个
B) 一个函数的参数若有多个,则参数默认值的设定可以不连续
C) 函数参数必须设定默认值
D) 在设定了参数的默认值后,该参数后面定义的所有参数都必须设定默认值
2. 假定 AB 为一个类,则执行 AB x ;语句时将自动调用该类的( ) 。
A) 有参构造函数 B) 无参构造函数
C) 拷贝构造函数 D) 赋值构造函数
3. 下述关于开关语句的描述中,( )是正确的。
A) 开关语句中default 子句可以没有,也可以有一个;
B) 开关语句中每个语句序列中必须有break 语句;
C) 开关语句中default 子句只能放在最后;
D) 开关语句中case 子句后面的表达式可以是整形表达式。
4. 关于对象概念的描述中,( ) 是错误的。
A) 对象就是C 语言中的结构变量;
B) 对象代表着正在创建的系统中的一个实体;
C) 对象是一个状态和操作(或方法)的封装体;
D) 对象之间的信息传递是通过消息进行的;
5. 下列给字符数组进行初始化中,( )是正确的。
A) char s1[ ]="12345abcd"; B) char s2[3]="xyz";
C) char s3[][3]={ 'a', 'x', 'y'}; D) char s4[2[3]={"xyz","mnp"};
6. 在int a[][3]={{1},{3,2},{4,5,6},{0}}中,a[2][2]的值是 ( ) 。
A) 3 B) 2 C) 6 D) 4
7. 声明类test 的拷贝构造函数的正确形式是 ( ) 。
A) int test B) void test C) test(void) D) test(test&)
8. 关于new 运算符的下列描述中,( ) 是错的。
A) 它可以用来动态创建对象和对象数组;
B) 使用它创建的对象或对象数组可以使用运算符delete 删除;
C) 使用它创建对象时要调用构造函数;
D) 使用它创建对象数组时必须指定初始值。
9. 在 C++ 中有以下 4 条语句: static int hot=200;int &rad=hot;
hot=hot+100;cout
A) 0 B) 100
C) 300 D) 200
10. 下列关于构造函数的描述中,错误的是 ( ) 。
A) 构造函数可以设置默认参数;
B) 构造函数在声明对象时自动执行;
C) 构造函数可以对静态数据成员进行初始化;
D) 构造函数可以重载; 。
11. 下面关于重载函数的说明中正确的是( ) 。
A) 重载函数必须具有不同的返回类型。 B) 重载函数形参的个数必须不同 C) 重载函数必须具有不同的形式参数表 D) 重载函数名可以不同
12. 下列关于C++函数的说明中,正确的是( ) 。
A) 内联函数就是定义在另一个函数体内部的函数
B) 函数体的最后一条语句必须是 return 语句
C) C++要求在调用一个函数前必须先声明其原型
D) 编译器会根据函数的返回值类型和参数表来区分函数的不同重载形式
13. 已知函数原型为:
void foo(int*, long &b);
实参定义为:
int i; long f;
则正确的调用语句是( ).
A) foo(i, &f); B) foo(i, f); C) foo(&i, f); D) foo(&i, &f);
14. C++中对于结构中定义的成员,其默认的访问权限为( ) 。
A) public B) protected C) private D) static
15. 下列关于类与对象的说法中,不正确的是( ) 。
A) 对象是类的一个实例
B) 任何对象只能属于一个具体的类
C) 一个类只能有一个对象
D) 类与对象的关系和数据类型与变量的关系相似
16. 下列关于构造函数的描述中错误的是( )
A) 构造函数可以设置默认参数 B) 构造函数在定义类对象时自动执行
C) 构造函数可以对静态数据成员进行初始化 D) 构造函数不可以重载
17. 类的析构函数的作用是( ) 。
A) 作为类的一般成员函数 B) 类的初始化 C) 对象的初始化 D) 对象的删除
18. 以下关于静态数据成员的描述正确的是( ) 。
A) 静态数据成员可以在类体中进行初始化 B) 静态数据成员不可以被类的实例调用 C) 静态数据成员不能受protected 控制符的作用 D) 静态数据成员可以直接用类名调用
19. 下面关于友元函数的描述中正确的是( ) 。
A) 友元函数的实现必须在类的内部定义 B) 友元函数是类的成员函数
C) 友元函数破坏了类的封装性和隐藏性 C) 友元函数不能访问类的私有成员
20. 下面关于友元函数的描述中错误的是( ) 。
A) 如果类A 是类B 的友元,那么类B 也是类A 的友元
B) 如果函数fun()被说明为类A 的友元,那么在fun()中可以访问类A 的私有成员
C) 友元关系不能被继承
D) 如果类A 是类B 的友元,那么类A 的所有成员函数都是类B 的友元函数
21. 下列属于C++语句的是 。
A) ; B) a=17 C) a+5 D) cout
22. 执行语句k=30;j=k++;后k 和j 的值分别为 。
A) k=30,j=30 B) k=30,j=31
C) k=31,j=30 D) k=31,j=31
23. 若X 是一个bool 型变量,则X && 5
A) 为true B) 为false
C) 与X 的值相同 D) 与X 的值相反
24. 如果a=1,b=2,c=3,d=4,则条件表达式“a>b?a:c
A) 3 B) 2 C) 1 D) 4
25. 执行下列语句后的输出结果是 。
int hot=100;
int &rad=hot;
hot+=100;
cout
A) 0 B) 100
C) 200 D) 300
26. 下列关于break 语句的叙述不正确的是 。
A) break语句可用于循环体中,它将使执行流程跳出本层循环体;
break 语句可用于switch 语句中,它将使执行流程跳出当前的switch 语句;
break 语句可用于if 语句中,它将使执行流程跳出当前if 语句;
break 语句在一层循环体中可以出现多次。
27. 下面关于类的对象性质的描述,正确的是 。
A) 对象之间不可以相互赋值 B) 不可以说明指向对象的指针
C) 对象不能用作数组元素 D) 一个对象能用作另一个对象的成员
28. 在 C++ 中实现封装是借助于 。
A) 枚举 B) 类
C) 数组 D) 函数
29. 下列不是描述类的成员函数的是 。
A) 构造函数 B) 析构函数
C) 友元函数 D) 拷贝构造函数
30. 不能作为函数重载判断依据的是 。
A) 参数个数 B) 参数类型
C) 函数名称 D )返回值类型
31. 假定一个类的构造函数为 A(int aa,int bb){a=aa++;b=a*bb++;} ,则执行
A X(4,5); 语句后, X.a 和 X.b 的值分别为 。
A) 4 和 5 B) 5 和 30
C) 4 和 20 D ) 20 和 5
32. 对于double (*p)[10];的描述, 是正确的。
A) p是一个指向数组的指针,所指向的数组是10个double 型元素;
B) p是一个指向某个数组中第10个元素的指针,该元素是double 型变量;
C) p[5]表示某个数组的第10个元素的值;
D) p是一个具有10个元素的指针数组,每个元素是一个double 型指针;
33. 下面的函数声明中, 哪一个是” void BC(int a, int b);”的重载函数?
A) int BC(int a, int b) B) void BC(int a, char b)
C) float BC(int a, int b, int c = 0) D) void BC(int a, int b=0)
34. 已知 char c; char * const pc="asdf ", 是正确的。
A) pc="dfgh " B) *pc=‘b’
C) *pc++=‘y’ D) pc=&c
35. 下列关于构造函数的叙述,错误的是 。
A) 构造函数可以设置默认参数;
B) 构造函数在说明类变量时自动调用;
C) 构造函数可以对静态数据成员进行初始化;
D) 构造函数可以重载;
36. 下列关于构造函数的描述中错误的是( )
A) 构造函数可以设置默认参数 B) 构造函数在定义类对象时自动执行
C) 构造函数可以对静态数据成员进行初始化 D) 构造函数不可以重载
37. 类的析构函数的作用是( ) 。
A) 作为类的一般成员函数 B) 类的初始化 C) 对象的初始化 D) 对象的删除
38. 以下关于静态数据成员的描述正确的是( ) 。
A) 静态数据成员可以在类体中进行初始化 B) 静态数据成员不可以被类的实例调用 C) 静态数据成员不能受protected 控制符的作用 D) 静态数据成员可以直接用类名调用
39. 下面关于友元函数的描述中正确的是( ) 。
A) 友元函数的实现必须在类的内部定义 B) 友元函数是类的成员函数
C) 友元函数破坏了类的封装性和隐藏性 C) 友元函数不能访问类的私有成员
40. 下面关于友元函数的描述中错误的是( ) 。
A) 如果类A 是类B 的友元,那么类B 也是类A 的友元
B) 如果函数fun()被说明为类A 的友元,那么在fun()中可以访问类A 的私有成员
C) 友元关系不能被继承
D) 如果类A 是类B 的友元,那么类A 的所有成员函数都是类B 的友元函数
41. 重载函数在调用时选择的依据中,错误的是 ( )
A. 函数的参数 B. 参数的类型 C. 函数的名字 D. 函数的类型
42. 一个函数功能不太复杂,但要求被频繁调用,选用 ( . )
A. 内联函数 B. 重载函数 C. 递归函数 D. 嵌套函数
43. 下列不是描述类的成员函数的是 ( )
A. 构造函数 B. 析构函数 C. 友元函数 D. 拷贝构造函数
44. 构造函数不具备的特征的是 ( )
A. 构造函数的函数名与类名相同 B. 构造函数可以重载
C. 构造函数可以设置默认参数 D. 构造函数可以指定返回类型
45. 通常,拷贝构造函数的参数是 ( )
A. 某个对象名 B. 某个对象的成员名
C. 某个对象的引用名 D. 某个对象的指针名
46. 继承机制的作用是 ( )
A. 信息隐藏 B. 数据封装 C. 代码重用 D. 数据抽象
47. 类的析构函数的作用是 ( )
A. 一般成员函数 B. 类的初始化 C. 对象的初始化 D. 删除对象创建的所有对象
48. 类的析构函数是在 ( ) 调用的。
A. 类创建时 B. 创建对象时 C. 删除对象时 D. 不自动调用
49. 已知print ()函数是一个类无返回值的常成员函数,下列表示中正确的是( ) 。
A.void print()const B.const void print()
C.void const print ; D.void print (const );
50. 如果类 A 被说明成类 B 的友元,则 ( )
A. 类 A 的成员即类 B 的成员 B. 类 B 的成员即类 A 的成员
C. 类 A 的成员函数不得访问类 B 的成员 D. 类 B 不一定是类 A 的友元
51. 通过一个对象调用虚函数时,C++系统对该调用采用( ) 。
A. 动态联编 B. 静态联编 C. 不确定是哪种联编 D. 函数重载
52. 在公有继承的情况下,基类成员在派生类中的访问权限 ( )
A. 受限制 B. 保持不变 C. 受保护 D. 不受保护
53. 在C++中,当一个对象被创建后,它的每一个成员函数都含有一个系统自动生成的隐含的指针,称之为
( ) 指针。
A. 对象 B. 派生 C 基类 D.this
54. 假定 AB 为一个类,则执行 AB x ;语句时将自动调用该类的 ( )
A. 有参构造函数 B. 无参构造函数
C. 拷贝构造函数 D. 赋值构造函数
55. C++ 语言建立类族是通过 ( )
A. 类的嵌套 B. 类的继承 C. 虚函数 D. 抽象类
二、判断题
1、C++中,数组下标从1开始。( )
2、C++允许对字符串进行整体操作。( )
3、break 语句也可以用于if 体内,它可退出if 语句。( )
4、在说明语句 char a(‘A ’),&b=a,*pa=&a;中,b 的值与*pa的值相等。( )
5、对象数组的元素可以是不同类的对象。( )
6、私有继承中,基类中所有成员对派生类的对象都是不可见的。( )
7、类中所提供的成员函数可以直接访问私有成员。( )
8、按照标识符的要求,下划线是不能组成正确标识符的。( )
9、函数的默认参数没有顺序要求,可以随意定义。( )
10、在 C++ 语言中,”A”占两个字节,而 ’A’占一个字节。( )
11、C++语言支持封装性和继承性,不支持多态性。[ ]
12、关系运算符可以用来比较两个字符的大小,也可用来比较两个字符串的大小。)[ ]
13、字符串"sdfgh" 的长度是5。[ ]
14、引用和指针都可作函数参数。[ ]
15、友元函数说明在类体内,它是一种成员函数。[ ]
16、友元类必须被说明为公有成员。[ ]
17、纯虚函数是在基类中说明的虚函数,它在该基类中没有定义具体的操作内容。[ ]
18、析构函数不能被继承。[ ]
19、运算符重载以后,其优先级和结合性都不能改变。[ ]
20、在C++中,函数名实际上是一个指针,它指向函数的入口。[ ]
21、构造函数可以被继承。( )
22、析构函数不能被继承。( )
23、多继承情况下,派生类的构造函数的执行顺序取决于定义派生时所指定的各基类的顺序。( )
24、解决多继承情况下出现的二义性的方法之一是使用成员名限定法。( )
25、函数的参数个数和类型都相同,只是返回值不同,这不是重载函数。( )
26、多数运算符可以重载,个别运算符不能重载,运算符重载是通过函数定义实现的。( )
27、对每个可重载的运算符来讲,它既可以重载为友元函数,又可以重载为成员函数,还可以重载为非成员函数。( )
28、对单目运算符重载为友元函数时,说明一个形参; 重载为成员函数时, 不能显式说明形参。( )
29、重载运算符保持原运算符的优先级和结合性不变。( )
30、构造函数说明为纯虚函数是没有意义的。( )
三、简答题
1. 简述C++的异常处理机制?
2.C++的预定义的流对象有哪些?
3. 试以客观世界为例,说明抽象、封装、继承性和多态性等概念。
4. 多继承的情况下为什么会产生二义性?如何消除二义性?
5. 试说明 void F(const T &t); 和 inf f() const; 中关键字 const 作用。
6. 有如下程序
#include
#include
using namespace std;
class B;
class A{
friend B;
public:
A(){ } A(const A &a){
cout
cout
}
~A(){
cout
}
};
class B: public A{
public:
B(){
cout
}
B(const A a){
cout
}
};
void f(A &a){
cout
}
void ff(const B &b){
cout
}
void ff(A a){}
int main()
{
A a;
B bb=a;
}
程序运行的结果是_________________________
7. 有如下程序
#include
using namespace std;
template
class HisClass
{
Type data;
public:
HisClass(Type a, Type b, Type c);
Type getData();
};
template
HisClass::HisClass(Type a, Type b, Type c){ if(a>b&&a>c)
data=a;
else
if(b>c)
data=b;
else
data=c;
}
template
Type HisClass::getData()
{
return data;
}
int main()
{
HisClass x1(3,4,5), x2(5,3,4),
x3(4,5,3), x4(7,8,9),
x5(8,7,9);
cout
system("pause");
return 0;
}
程序运行的结果是_________________________
8. 以下程序在运行中出现致命错误,找出错误原因并修正。
#include
#include
class sample{
private:
char *string;
public:
sample(const char *s){
string = new char[strlen(s)+1]; strcpy(string s);
}
~sample(){
delete string;
};
};
sample f(char *arg){
sample tmp(arg);
return tmp;
}
int main()
{
sample local=f("abcd");
return 0;
}
9. 有如下程序
#include
using namespace std;
class P
{
char *name;
int age;
char *add;
public:
P(){
cout
}
~P(){
cout
}
};
class S:public P
{
char *department;
int level;
public:
S(){
cout
}
~S(){
cout
}
};
class T: public P
{
char *major;
float s;
public:
T(){
cout
}
~T(){
cout
}
};
int main()
{
S s;
T t;
system("pause");
return 0;
}
程序运行的结果是_________________________
10. 有如下程序
#include
using namespace std;
class B {
public:
B( ) {
cout
virtual void f( ) = 0;
virtual void g( ) = 0;
f( );
cout
}
virtual ~B( ){
cout
num--;
}
static int getNum( ){
return num;
}
private:
static int num;
};
class D1: public B {
public:
D1( ) {
cout
}
void f( ) {
cout
}
void g( ){
cout
}
~D1( ) {
cout
}
};
class D2: public B {
public:
D2( ) {
cout
}
void f( ){
cout
}
void g( ){
cout
}
cout
}
};
int B::num = 0;
int main( )
{
B* buf[3];
buf[0] = new D1;
buf[1] = new D2;
buf[2] = new D1;
int i;
cout
for ( i = 0; i
buf[i]->k( );
for (i = 0; i
delete buf[i];
cout
system("pause");
return 0;
}
程序运行的结果是_________________________
11. 有如下程序
#include
using namespace std;
class R
{
public:
R(int r1, int r2): R1(r1), R2(r2){};
void print();
void print() const;
private:
int R1, R2;
};
void R::print(){
cout
};
void R::print()const{
cout
}
R a(5,4);
const R b(20,52);
b.print();
system("pause");
return 1;
}
程序运行的结果是_________________________
12. 有如下程序
#include
using namespace std;
class demo{
public:
static int constructor, copy_constructor;
demo(){
cout
constructor++;
}
demo(const demo& x){
cout
copy_constructor++;
}
};
int demo::constructor=0;
int demo::copy_constructor=0;
demo usercode(demo b){
demo c(b);
return c;
}
int main()
{
demo a, d;
cout
d=usercode(a);
cout
程序运行的结果是_________________________
13. 有如下程序
#include
using namespace std;
class A{
static int m;
int n;
public:
A(int m, int n){
m=this->m;
n=this->n;
}
Show(){
cout
}
}
int A::m;
int main()
{
A a1(3,4);
A a2(5,6);
a1.Show();
a2.Show();
}
程序运行的结果是_________________________
14. 有如下程序
#include
using namespace std;
class P
{
char *name;
int age;
char *add;
public:
cout
}
~P(){
cout
}
};
class S:public P
{
char *department;
int level;
public:
S(){
cout
}
~S(){
cout
}
};
class T: public P
{
char *major;
float s;
public:
T(){
cout
}
~T(){
cout
}
};
int main()
{
S s;
T t;
system("pause");
return 0;
}
程序运行的结果是_________________________
15. 为什么要定义虚析构函数?
有如下程序
#include
using namespace std;
class B {
public:
B( ) {
cout
}
virtual void f( ) = 0;
virtual void g( ) = 0;
void k( ){
f( );
cout
}
virtual ~B( ){
cout
num--;
}
static int getNum( ){
return num;
}
private:
static int num;
};
class D1: public B {
public:
D1( ) {
cout
}
void f( ) {
cout
}
void g( ){
cout
}
~D1( ) {
cout
}
};
16.
class D2: public B {
public:
D2( ) {
cout
}
void f( ){
cout
}
void g( ){
cout
}
~D2( ){
cout
}
};
int B::num = 0;
int main( )
{
B* buf[3];
buf[0] = new D1;
buf[1] = new D2;
buf[2] = new D1;
int i;
cout
for ( i = 0; i
buf[i]->k( );
for (i = 0; i
delete buf[i];
cout
system("pause");
return 0;
}
程序运行的结果是_________________________
17. 有如下程序
#include
using namespace std;
class R
{
public:
R(int r1, int r2): R1(r1), R2(r2){};
void print();
void print() const;
private:
int R1, R2;
};
void R::print(){
cout
};
void R::print()const{
cout
}
int main()
{
R a(5,4);
const R b(20,52);
b.print();
system("pause");
return 1;
}
程序运行的结果是_________________________
18. 有如下程序
#include
using namespace std;
class B;
class A{
friend B;
public:
A(){
cout
}
A(const A &a){
cout
}
~A(){
cout
}
};
class B: public A{
public:
B(){
cout
}
B(const A a){
cout
}
};
void f(A &a){
cout
}
void ff(const B &b){
cout
}
void ff(A a){}
int main()
{
A a;
B bb=a;
}
19. 有如下程序
#include
using namespace std;
class demo{
public:
static int constructor, copy_constructor;
demo(){
cout
constructor++;
}
demo(const demo& x){
cout
copy_constructor++;
}
};
int demo::constructor=0;
int demo::copy_constructor=0;
demo usercode(demo b){
demo c(b);
return c;
}
int main()
{
demo a, d;
cout
d=usercode(a);
cout
return 0;
}
程序运行的结果是_________________________
20. 请分析下面的程序并给出该程序的执行结果。
#include
class AA{
int a;
public :
AA( ){cout
~AA( ){cout
};
class BB{
int b;
AA p;
public :
BB( ){cout
~BB( ){cout
};
void main( )
{BB X;
cout
}
执行该程序后, 输出结果为:
21. 写出下列程序的运行结果。
#include
using namespace std;
class AA{
int a;
public :
AA(int i){a=i;coutvirtual ~AA( ){cout};
class BB:public AA{
int b;
public :
BB(int i,int j):AA(i){b=j;cout
~BB( ){cout
};
void main( )
{AA *pa=new AA(8); delete pa;
AA*pb=new BB(6,9); delete pb;
}
执行该程序后, 输出结果为:
22. 写出下面程序的输出结果。
#include
class Test{
private:
static int val;
int a;
public:
static int func();
static void sfunc(Test &r);
};
int Test::val=20;
int Test::func()
{
val--;
return val;
}
void Test::sfunc(Test &r)
{
r.a=25;
cout
}
void main()
{
cout
Test a;
coutTest::sfunc(a);
}
执行该程序后, 输出结果为:
23. 写出下面程序输出结果。
# include
class A {
public:
virtual void func(){cout
};
class B {
public:
virtual void func(){cout
};
class C:public A, public B {
public:
void func(){cout
};
void main()
{ C c; A& pa=c; B& pb=c; C& pc=c; pa.func(); pb.func();
执行该程序后, 输出结果为:
24. 写出下面程序的输出结果。
# include
class Location{
public:
int X,Y;
void init(int initX,int initY);
int GetX();
int GetY();
};
void Location::init (int initX,int initY){
X=initX;
Y=initY; pv.func();
}
}
int Location::GetX() { return X; }
int Location::GetY() { return Y; }
void display(Location& rL) { cout
void main()
{ Location A[5]={{0,0},{1,1},{2,2},{3,3},{4,4}};
Location *rA=A; A[3].init(5,3);
rA->init(7,8);
for (int i=0;i
}
执行该程序后, 输出结果为:
四、程序设计题
1. 以下是一个整数栈类的定义:
const unsigned in SIZE=100;
class stack{
public:
stack();
~stack();
void push(int);
void pop();
int pop() const;
private:
int stack[SIZE];
int tos;
}
试编写一个栈的类模板(包括其成员函数定义),以便为任何类型的对象提供栈结构数据的操作。
2. 编程从键盘输入x 和y 的值,计算y=ln(2x-y)的值,要求设计一个“负数求对数”的异常类,并写出测试程序。(对数函数log()在math.h 中定义)
3. 写一个函数,找出给定字符串中具有最大ASCII 码的字符。如字符串"world" 中字符'w' 具有最大的ASCII 码。函数的原型为:
char MaxCharacter(char * str);
函数参数:指向所要处理的字符串;
函数返回值:如果不空,则返回具有最大ASCII 码的字符,否则返回空字符0x0或'\0'。
4. 它的公有派生类其中包含载人数passenger_load。卡车类truck 是vehicle 的公有派生类其中包含载人
数passenger_load和载重量payload ,每个类都有相关数据的输出方法。要求用UML 图来表示各个类及其相互的关系。
5. 根据下面类中Uion 函数的原型和注释写出它的类外定义。
classStrings{
char*s; //指向动态分配的字符串数组空间
int n : //记录字符串长度
public :
Strings(char-*str); //构造函数,利用str 字符串长度初始化n ,
//利用str 字符串初始化s 所指的字符串空间
Strings(Strings&str); //拷贝构造函数
Strings& Give(Strings& str); //实现str 赋值给*this的功能并返回*this
Strings Uion(Strings& str); //实现8this 和str 中的字符串连接的功能,
//把连接结果存人临时对象并返回
intLenth(){returnn;} //返回字符串长度
voidPrint(){eout
};
6. 设计一个文本文件的链接类CFileLink, 通过该类的使用,可以实现一个文件链接到另一个文件的的功能。将2个现有文件 的内容复制到一个新文件中。为了实现文件的复制需要使用get()函数读取字符,用put()函数写入字符,从而实现逐个字符的复制。
class CFileLink{
fstream file1, file2, file3;
char fn1[20], fn2[20], fn3[20];
public:
}
7. 设计一个文本文件的复制类CFileCopy, 通过该类的使用,可以实现一个文件复制到另一个文件的的功能。为了实现文件的复制需要使用get()函数读取字符,用put()函数写入字符,从而实现逐个字符的复制。 class CFileCopy{
fstream file1, file2;
char fn1[20], fn2[20];
public:
}
CFileCopy(); ~CFileCopy(); void copyfile(); // 打开file1, file2,将file1的内容写到file2 void printfile(); // 输出file1和file2的内容 CFileLink(); ~CFileLink(); void linkfile(); // 打开file1, file2,将file1, file2的内容写到file3 void printfile(); // 输出file3的内容
一、单项选择题
1. 在C++语言中,对函数参数默认值描述正确的是:( )
A) 函数参数的默认值只能设定一个
B) 一个函数的参数若有多个,则参数默认值的设定可以不连续
C) 函数参数必须设定默认值
D) 在设定了参数的默认值后,该参数后面定义的所有参数都必须设定默认值
2. 假定 AB 为一个类,则执行 AB x ;语句时将自动调用该类的( ) 。
A) 有参构造函数 B) 无参构造函数
C) 拷贝构造函数 D) 赋值构造函数
3. 下述关于开关语句的描述中,( )是正确的。
A) 开关语句中default 子句可以没有,也可以有一个;
B) 开关语句中每个语句序列中必须有break 语句;
C) 开关语句中default 子句只能放在最后;
D) 开关语句中case 子句后面的表达式可以是整形表达式。
4. 关于对象概念的描述中,( ) 是错误的。
A) 对象就是C 语言中的结构变量;
B) 对象代表着正在创建的系统中的一个实体;
C) 对象是一个状态和操作(或方法)的封装体;
D) 对象之间的信息传递是通过消息进行的;
5. 下列给字符数组进行初始化中,( )是正确的。
A) char s1[ ]="12345abcd"; B) char s2[3]="xyz";
C) char s3[][3]={ 'a', 'x', 'y'}; D) char s4[2[3]={"xyz","mnp"};
6. 在int a[][3]={{1},{3,2},{4,5,6},{0}}中,a[2][2]的值是 ( ) 。
A) 3 B) 2 C) 6 D) 4
7. 声明类test 的拷贝构造函数的正确形式是 ( ) 。
A) int test B) void test C) test(void) D) test(test&)
8. 关于new 运算符的下列描述中,( ) 是错的。
A) 它可以用来动态创建对象和对象数组;
B) 使用它创建的对象或对象数组可以使用运算符delete 删除;
C) 使用它创建对象时要调用构造函数;
D) 使用它创建对象数组时必须指定初始值。
9. 在 C++ 中有以下 4 条语句: static int hot=200;int &rad=hot;
hot=hot+100;cout
A) 0 B) 100
C) 300 D) 200
10. 下列关于构造函数的描述中,错误的是 ( ) 。
A) 构造函数可以设置默认参数;
B) 构造函数在声明对象时自动执行;
C) 构造函数可以对静态数据成员进行初始化;
D) 构造函数可以重载; 。
11. 下面关于重载函数的说明中正确的是( ) 。
A) 重载函数必须具有不同的返回类型。 B) 重载函数形参的个数必须不同 C) 重载函数必须具有不同的形式参数表 D) 重载函数名可以不同
12. 下列关于C++函数的说明中,正确的是( ) 。
A) 内联函数就是定义在另一个函数体内部的函数
B) 函数体的最后一条语句必须是 return 语句
C) C++要求在调用一个函数前必须先声明其原型
D) 编译器会根据函数的返回值类型和参数表来区分函数的不同重载形式
13. 已知函数原型为:
void foo(int*, long &b);
实参定义为:
int i; long f;
则正确的调用语句是( ).
A) foo(i, &f); B) foo(i, f); C) foo(&i, f); D) foo(&i, &f);
14. C++中对于结构中定义的成员,其默认的访问权限为( ) 。
A) public B) protected C) private D) static
15. 下列关于类与对象的说法中,不正确的是( ) 。
A) 对象是类的一个实例
B) 任何对象只能属于一个具体的类
C) 一个类只能有一个对象
D) 类与对象的关系和数据类型与变量的关系相似
16. 下列关于构造函数的描述中错误的是( )
A) 构造函数可以设置默认参数 B) 构造函数在定义类对象时自动执行
C) 构造函数可以对静态数据成员进行初始化 D) 构造函数不可以重载
17. 类的析构函数的作用是( ) 。
A) 作为类的一般成员函数 B) 类的初始化 C) 对象的初始化 D) 对象的删除
18. 以下关于静态数据成员的描述正确的是( ) 。
A) 静态数据成员可以在类体中进行初始化 B) 静态数据成员不可以被类的实例调用 C) 静态数据成员不能受protected 控制符的作用 D) 静态数据成员可以直接用类名调用
19. 下面关于友元函数的描述中正确的是( ) 。
A) 友元函数的实现必须在类的内部定义 B) 友元函数是类的成员函数
C) 友元函数破坏了类的封装性和隐藏性 C) 友元函数不能访问类的私有成员
20. 下面关于友元函数的描述中错误的是( ) 。
A) 如果类A 是类B 的友元,那么类B 也是类A 的友元
B) 如果函数fun()被说明为类A 的友元,那么在fun()中可以访问类A 的私有成员
C) 友元关系不能被继承
D) 如果类A 是类B 的友元,那么类A 的所有成员函数都是类B 的友元函数
21. 下列属于C++语句的是 。
A) ; B) a=17 C) a+5 D) cout
22. 执行语句k=30;j=k++;后k 和j 的值分别为 。
A) k=30,j=30 B) k=30,j=31
C) k=31,j=30 D) k=31,j=31
23. 若X 是一个bool 型变量,则X && 5
A) 为true B) 为false
C) 与X 的值相同 D) 与X 的值相反
24. 如果a=1,b=2,c=3,d=4,则条件表达式“a>b?a:c
A) 3 B) 2 C) 1 D) 4
25. 执行下列语句后的输出结果是 。
int hot=100;
int &rad=hot;
hot+=100;
cout
A) 0 B) 100
C) 200 D) 300
26. 下列关于break 语句的叙述不正确的是 。
A) break语句可用于循环体中,它将使执行流程跳出本层循环体;
break 语句可用于switch 语句中,它将使执行流程跳出当前的switch 语句;
break 语句可用于if 语句中,它将使执行流程跳出当前if 语句;
break 语句在一层循环体中可以出现多次。
27. 下面关于类的对象性质的描述,正确的是 。
A) 对象之间不可以相互赋值 B) 不可以说明指向对象的指针
C) 对象不能用作数组元素 D) 一个对象能用作另一个对象的成员
28. 在 C++ 中实现封装是借助于 。
A) 枚举 B) 类
C) 数组 D) 函数
29. 下列不是描述类的成员函数的是 。
A) 构造函数 B) 析构函数
C) 友元函数 D) 拷贝构造函数
30. 不能作为函数重载判断依据的是 。
A) 参数个数 B) 参数类型
C) 函数名称 D )返回值类型
31. 假定一个类的构造函数为 A(int aa,int bb){a=aa++;b=a*bb++;} ,则执行
A X(4,5); 语句后, X.a 和 X.b 的值分别为 。
A) 4 和 5 B) 5 和 30
C) 4 和 20 D ) 20 和 5
32. 对于double (*p)[10];的描述, 是正确的。
A) p是一个指向数组的指针,所指向的数组是10个double 型元素;
B) p是一个指向某个数组中第10个元素的指针,该元素是double 型变量;
C) p[5]表示某个数组的第10个元素的值;
D) p是一个具有10个元素的指针数组,每个元素是一个double 型指针;
33. 下面的函数声明中, 哪一个是” void BC(int a, int b);”的重载函数?
A) int BC(int a, int b) B) void BC(int a, char b)
C) float BC(int a, int b, int c = 0) D) void BC(int a, int b=0)
34. 已知 char c; char * const pc="asdf ", 是正确的。
A) pc="dfgh " B) *pc=‘b’
C) *pc++=‘y’ D) pc=&c
35. 下列关于构造函数的叙述,错误的是 。
A) 构造函数可以设置默认参数;
B) 构造函数在说明类变量时自动调用;
C) 构造函数可以对静态数据成员进行初始化;
D) 构造函数可以重载;
36. 下列关于构造函数的描述中错误的是( )
A) 构造函数可以设置默认参数 B) 构造函数在定义类对象时自动执行
C) 构造函数可以对静态数据成员进行初始化 D) 构造函数不可以重载
37. 类的析构函数的作用是( ) 。
A) 作为类的一般成员函数 B) 类的初始化 C) 对象的初始化 D) 对象的删除
38. 以下关于静态数据成员的描述正确的是( ) 。
A) 静态数据成员可以在类体中进行初始化 B) 静态数据成员不可以被类的实例调用 C) 静态数据成员不能受protected 控制符的作用 D) 静态数据成员可以直接用类名调用
39. 下面关于友元函数的描述中正确的是( ) 。
A) 友元函数的实现必须在类的内部定义 B) 友元函数是类的成员函数
C) 友元函数破坏了类的封装性和隐藏性 C) 友元函数不能访问类的私有成员
40. 下面关于友元函数的描述中错误的是( ) 。
A) 如果类A 是类B 的友元,那么类B 也是类A 的友元
B) 如果函数fun()被说明为类A 的友元,那么在fun()中可以访问类A 的私有成员
C) 友元关系不能被继承
D) 如果类A 是类B 的友元,那么类A 的所有成员函数都是类B 的友元函数
41. 重载函数在调用时选择的依据中,错误的是 ( )
A. 函数的参数 B. 参数的类型 C. 函数的名字 D. 函数的类型
42. 一个函数功能不太复杂,但要求被频繁调用,选用 ( . )
A. 内联函数 B. 重载函数 C. 递归函数 D. 嵌套函数
43. 下列不是描述类的成员函数的是 ( )
A. 构造函数 B. 析构函数 C. 友元函数 D. 拷贝构造函数
44. 构造函数不具备的特征的是 ( )
A. 构造函数的函数名与类名相同 B. 构造函数可以重载
C. 构造函数可以设置默认参数 D. 构造函数可以指定返回类型
45. 通常,拷贝构造函数的参数是 ( )
A. 某个对象名 B. 某个对象的成员名
C. 某个对象的引用名 D. 某个对象的指针名
46. 继承机制的作用是 ( )
A. 信息隐藏 B. 数据封装 C. 代码重用 D. 数据抽象
47. 类的析构函数的作用是 ( )
A. 一般成员函数 B. 类的初始化 C. 对象的初始化 D. 删除对象创建的所有对象
48. 类的析构函数是在 ( ) 调用的。
A. 类创建时 B. 创建对象时 C. 删除对象时 D. 不自动调用
49. 已知print ()函数是一个类无返回值的常成员函数,下列表示中正确的是( ) 。
A.void print()const B.const void print()
C.void const print ; D.void print (const );
50. 如果类 A 被说明成类 B 的友元,则 ( )
A. 类 A 的成员即类 B 的成员 B. 类 B 的成员即类 A 的成员
C. 类 A 的成员函数不得访问类 B 的成员 D. 类 B 不一定是类 A 的友元
51. 通过一个对象调用虚函数时,C++系统对该调用采用( ) 。
A. 动态联编 B. 静态联编 C. 不确定是哪种联编 D. 函数重载
52. 在公有继承的情况下,基类成员在派生类中的访问权限 ( )
A. 受限制 B. 保持不变 C. 受保护 D. 不受保护
53. 在C++中,当一个对象被创建后,它的每一个成员函数都含有一个系统自动生成的隐含的指针,称之为
( ) 指针。
A. 对象 B. 派生 C 基类 D.this
54. 假定 AB 为一个类,则执行 AB x ;语句时将自动调用该类的 ( )
A. 有参构造函数 B. 无参构造函数
C. 拷贝构造函数 D. 赋值构造函数
55. C++ 语言建立类族是通过 ( )
A. 类的嵌套 B. 类的继承 C. 虚函数 D. 抽象类
二、判断题
1、C++中,数组下标从1开始。( )
2、C++允许对字符串进行整体操作。( )
3、break 语句也可以用于if 体内,它可退出if 语句。( )
4、在说明语句 char a(‘A ’),&b=a,*pa=&a;中,b 的值与*pa的值相等。( )
5、对象数组的元素可以是不同类的对象。( )
6、私有继承中,基类中所有成员对派生类的对象都是不可见的。( )
7、类中所提供的成员函数可以直接访问私有成员。( )
8、按照标识符的要求,下划线是不能组成正确标识符的。( )
9、函数的默认参数没有顺序要求,可以随意定义。( )
10、在 C++ 语言中,”A”占两个字节,而 ’A’占一个字节。( )
11、C++语言支持封装性和继承性,不支持多态性。[ ]
12、关系运算符可以用来比较两个字符的大小,也可用来比较两个字符串的大小。)[ ]
13、字符串"sdfgh" 的长度是5。[ ]
14、引用和指针都可作函数参数。[ ]
15、友元函数说明在类体内,它是一种成员函数。[ ]
16、友元类必须被说明为公有成员。[ ]
17、纯虚函数是在基类中说明的虚函数,它在该基类中没有定义具体的操作内容。[ ]
18、析构函数不能被继承。[ ]
19、运算符重载以后,其优先级和结合性都不能改变。[ ]
20、在C++中,函数名实际上是一个指针,它指向函数的入口。[ ]
21、构造函数可以被继承。( )
22、析构函数不能被继承。( )
23、多继承情况下,派生类的构造函数的执行顺序取决于定义派生时所指定的各基类的顺序。( )
24、解决多继承情况下出现的二义性的方法之一是使用成员名限定法。( )
25、函数的参数个数和类型都相同,只是返回值不同,这不是重载函数。( )
26、多数运算符可以重载,个别运算符不能重载,运算符重载是通过函数定义实现的。( )
27、对每个可重载的运算符来讲,它既可以重载为友元函数,又可以重载为成员函数,还可以重载为非成员函数。( )
28、对单目运算符重载为友元函数时,说明一个形参; 重载为成员函数时, 不能显式说明形参。( )
29、重载运算符保持原运算符的优先级和结合性不变。( )
30、构造函数说明为纯虚函数是没有意义的。( )
三、简答题
1. 简述C++的异常处理机制?
2.C++的预定义的流对象有哪些?
3. 试以客观世界为例,说明抽象、封装、继承性和多态性等概念。
4. 多继承的情况下为什么会产生二义性?如何消除二义性?
5. 试说明 void F(const T &t); 和 inf f() const; 中关键字 const 作用。
6. 有如下程序
#include
#include
using namespace std;
class B;
class A{
friend B;
public:
A(){ } A(const A &a){
cout
cout
}
~A(){
cout
}
};
class B: public A{
public:
B(){
cout
}
B(const A a){
cout
}
};
void f(A &a){
cout
}
void ff(const B &b){
cout
}
void ff(A a){}
int main()
{
A a;
B bb=a;
}
程序运行的结果是_________________________
7. 有如下程序
#include
using namespace std;
template
class HisClass
{
Type data;
public:
HisClass(Type a, Type b, Type c);
Type getData();
};
template
HisClass::HisClass(Type a, Type b, Type c){ if(a>b&&a>c)
data=a;
else
if(b>c)
data=b;
else
data=c;
}
template
Type HisClass::getData()
{
return data;
}
int main()
{
HisClass x1(3,4,5), x2(5,3,4),
x3(4,5,3), x4(7,8,9),
x5(8,7,9);
cout
system("pause");
return 0;
}
程序运行的结果是_________________________
8. 以下程序在运行中出现致命错误,找出错误原因并修正。
#include
#include
class sample{
private:
char *string;
public:
sample(const char *s){
string = new char[strlen(s)+1]; strcpy(string s);
}
~sample(){
delete string;
};
};
sample f(char *arg){
sample tmp(arg);
return tmp;
}
int main()
{
sample local=f("abcd");
return 0;
}
9. 有如下程序
#include
using namespace std;
class P
{
char *name;
int age;
char *add;
public:
P(){
cout
}
~P(){
cout
}
};
class S:public P
{
char *department;
int level;
public:
S(){
cout
}
~S(){
cout
}
};
class T: public P
{
char *major;
float s;
public:
T(){
cout
}
~T(){
cout
}
};
int main()
{
S s;
T t;
system("pause");
return 0;
}
程序运行的结果是_________________________
10. 有如下程序
#include
using namespace std;
class B {
public:
B( ) {
cout
virtual void f( ) = 0;
virtual void g( ) = 0;
f( );
cout
}
virtual ~B( ){
cout
num--;
}
static int getNum( ){
return num;
}
private:
static int num;
};
class D1: public B {
public:
D1( ) {
cout
}
void f( ) {
cout
}
void g( ){
cout
}
~D1( ) {
cout
}
};
class D2: public B {
public:
D2( ) {
cout
}
void f( ){
cout
}
void g( ){
cout
}
cout
}
};
int B::num = 0;
int main( )
{
B* buf[3];
buf[0] = new D1;
buf[1] = new D2;
buf[2] = new D1;
int i;
cout
for ( i = 0; i
buf[i]->k( );
for (i = 0; i
delete buf[i];
cout
system("pause");
return 0;
}
程序运行的结果是_________________________
11. 有如下程序
#include
using namespace std;
class R
{
public:
R(int r1, int r2): R1(r1), R2(r2){};
void print();
void print() const;
private:
int R1, R2;
};
void R::print(){
cout
};
void R::print()const{
cout
}
R a(5,4);
const R b(20,52);
b.print();
system("pause");
return 1;
}
程序运行的结果是_________________________
12. 有如下程序
#include
using namespace std;
class demo{
public:
static int constructor, copy_constructor;
demo(){
cout
constructor++;
}
demo(const demo& x){
cout
copy_constructor++;
}
};
int demo::constructor=0;
int demo::copy_constructor=0;
demo usercode(demo b){
demo c(b);
return c;
}
int main()
{
demo a, d;
cout
d=usercode(a);
cout
程序运行的结果是_________________________
13. 有如下程序
#include
using namespace std;
class A{
static int m;
int n;
public:
A(int m, int n){
m=this->m;
n=this->n;
}
Show(){
cout
}
}
int A::m;
int main()
{
A a1(3,4);
A a2(5,6);
a1.Show();
a2.Show();
}
程序运行的结果是_________________________
14. 有如下程序
#include
using namespace std;
class P
{
char *name;
int age;
char *add;
public:
cout
}
~P(){
cout
}
};
class S:public P
{
char *department;
int level;
public:
S(){
cout
}
~S(){
cout
}
};
class T: public P
{
char *major;
float s;
public:
T(){
cout
}
~T(){
cout
}
};
int main()
{
S s;
T t;
system("pause");
return 0;
}
程序运行的结果是_________________________
15. 为什么要定义虚析构函数?
有如下程序
#include
using namespace std;
class B {
public:
B( ) {
cout
}
virtual void f( ) = 0;
virtual void g( ) = 0;
void k( ){
f( );
cout
}
virtual ~B( ){
cout
num--;
}
static int getNum( ){
return num;
}
private:
static int num;
};
class D1: public B {
public:
D1( ) {
cout
}
void f( ) {
cout
}
void g( ){
cout
}
~D1( ) {
cout
}
};
16.
class D2: public B {
public:
D2( ) {
cout
}
void f( ){
cout
}
void g( ){
cout
}
~D2( ){
cout
}
};
int B::num = 0;
int main( )
{
B* buf[3];
buf[0] = new D1;
buf[1] = new D2;
buf[2] = new D1;
int i;
cout
for ( i = 0; i
buf[i]->k( );
for (i = 0; i
delete buf[i];
cout
system("pause");
return 0;
}
程序运行的结果是_________________________
17. 有如下程序
#include
using namespace std;
class R
{
public:
R(int r1, int r2): R1(r1), R2(r2){};
void print();
void print() const;
private:
int R1, R2;
};
void R::print(){
cout
};
void R::print()const{
cout
}
int main()
{
R a(5,4);
const R b(20,52);
b.print();
system("pause");
return 1;
}
程序运行的结果是_________________________
18. 有如下程序
#include
using namespace std;
class B;
class A{
friend B;
public:
A(){
cout
}
A(const A &a){
cout
}
~A(){
cout
}
};
class B: public A{
public:
B(){
cout
}
B(const A a){
cout
}
};
void f(A &a){
cout
}
void ff(const B &b){
cout
}
void ff(A a){}
int main()
{
A a;
B bb=a;
}
19. 有如下程序
#include
using namespace std;
class demo{
public:
static int constructor, copy_constructor;
demo(){
cout
constructor++;
}
demo(const demo& x){
cout
copy_constructor++;
}
};
int demo::constructor=0;
int demo::copy_constructor=0;
demo usercode(demo b){
demo c(b);
return c;
}
int main()
{
demo a, d;
cout
d=usercode(a);
cout
return 0;
}
程序运行的结果是_________________________
20. 请分析下面的程序并给出该程序的执行结果。
#include
class AA{
int a;
public :
AA( ){cout
~AA( ){cout
};
class BB{
int b;
AA p;
public :
BB( ){cout
~BB( ){cout
};
void main( )
{BB X;
cout
}
执行该程序后, 输出结果为:
21. 写出下列程序的运行结果。
#include
using namespace std;
class AA{
int a;
public :
AA(int i){a=i;coutvirtual ~AA( ){cout};
class BB:public AA{
int b;
public :
BB(int i,int j):AA(i){b=j;cout
~BB( ){cout
};
void main( )
{AA *pa=new AA(8); delete pa;
AA*pb=new BB(6,9); delete pb;
}
执行该程序后, 输出结果为:
22. 写出下面程序的输出结果。
#include
class Test{
private:
static int val;
int a;
public:
static int func();
static void sfunc(Test &r);
};
int Test::val=20;
int Test::func()
{
val--;
return val;
}
void Test::sfunc(Test &r)
{
r.a=25;
cout
}
void main()
{
cout
Test a;
coutTest::sfunc(a);
}
执行该程序后, 输出结果为:
23. 写出下面程序输出结果。
# include
class A {
public:
virtual void func(){cout
};
class B {
public:
virtual void func(){cout
};
class C:public A, public B {
public:
void func(){cout
};
void main()
{ C c; A& pa=c; B& pb=c; C& pc=c; pa.func(); pb.func();
执行该程序后, 输出结果为:
24. 写出下面程序的输出结果。
# include
class Location{
public:
int X,Y;
void init(int initX,int initY);
int GetX();
int GetY();
};
void Location::init (int initX,int initY){
X=initX;
Y=initY; pv.func();
}
}
int Location::GetX() { return X; }
int Location::GetY() { return Y; }
void display(Location& rL) { cout
void main()
{ Location A[5]={{0,0},{1,1},{2,2},{3,3},{4,4}};
Location *rA=A; A[3].init(5,3);
rA->init(7,8);
for (int i=0;i
}
执行该程序后, 输出结果为:
四、程序设计题
1. 以下是一个整数栈类的定义:
const unsigned in SIZE=100;
class stack{
public:
stack();
~stack();
void push(int);
void pop();
int pop() const;
private:
int stack[SIZE];
int tos;
}
试编写一个栈的类模板(包括其成员函数定义),以便为任何类型的对象提供栈结构数据的操作。
2. 编程从键盘输入x 和y 的值,计算y=ln(2x-y)的值,要求设计一个“负数求对数”的异常类,并写出测试程序。(对数函数log()在math.h 中定义)
3. 写一个函数,找出给定字符串中具有最大ASCII 码的字符。如字符串"world" 中字符'w' 具有最大的ASCII 码。函数的原型为:
char MaxCharacter(char * str);
函数参数:指向所要处理的字符串;
函数返回值:如果不空,则返回具有最大ASCII 码的字符,否则返回空字符0x0或'\0'。
4. 它的公有派生类其中包含载人数passenger_load。卡车类truck 是vehicle 的公有派生类其中包含载人
数passenger_load和载重量payload ,每个类都有相关数据的输出方法。要求用UML 图来表示各个类及其相互的关系。
5. 根据下面类中Uion 函数的原型和注释写出它的类外定义。
classStrings{
char*s; //指向动态分配的字符串数组空间
int n : //记录字符串长度
public :
Strings(char-*str); //构造函数,利用str 字符串长度初始化n ,
//利用str 字符串初始化s 所指的字符串空间
Strings(Strings&str); //拷贝构造函数
Strings& Give(Strings& str); //实现str 赋值给*this的功能并返回*this
Strings Uion(Strings& str); //实现8this 和str 中的字符串连接的功能,
//把连接结果存人临时对象并返回
intLenth(){returnn;} //返回字符串长度
voidPrint(){eout
};
6. 设计一个文本文件的链接类CFileLink, 通过该类的使用,可以实现一个文件链接到另一个文件的的功能。将2个现有文件 的内容复制到一个新文件中。为了实现文件的复制需要使用get()函数读取字符,用put()函数写入字符,从而实现逐个字符的复制。
class CFileLink{
fstream file1, file2, file3;
char fn1[20], fn2[20], fn3[20];
public:
}
7. 设计一个文本文件的复制类CFileCopy, 通过该类的使用,可以实现一个文件复制到另一个文件的的功能。为了实现文件的复制需要使用get()函数读取字符,用put()函数写入字符,从而实现逐个字符的复制。 class CFileCopy{
fstream file1, file2;
char fn1[20], fn2[20];
public:
}
CFileCopy(); ~CFileCopy(); void copyfile(); // 打开file1, file2,将file1的内容写到file2 void printfile(); // 输出file1和file2的内容 CFileLink(); ~CFileLink(); void linkfile(); // 打开file1, file2,将file1, file2的内容写到file3 void printfile(); // 输出file3的内容