分类: C/C++
2011-08-18 20:49:27
C++测试题
一、单项选择题(12题,每题5分)
1. 已定义了一个类A并有语句 A* pa=new A(5); 那么以下说法正确的是:
A. 该语句会创建A类的一个对象,并将此对象的地址赋给指针pa;
B. 该语句会创建A类的5个对象,且它们的地址是连续的;
C. 当指针变量pa超出其作用域时,pa和为对象分配的空间都将被自动释放;
D. 类A中一定有一个显式定义的构造函数和一个显式定义的虚析构函数;
2. 定义类A的非静态成员函数A& f(A& one)时,需有语句return exp;则exp不能是:
A.类A中类型为A的静态数据成员 B. f中用语句 A a = one; 定义的量a
C. one D. *this
3. 在一个类中,下列哪些成员可以是多个?
A. 无参构造函数 B. 析构函数
C. 原型相同的非静态成员函数 D. 静态成员函数
4. 对于通过公有继承定义的派生类,若其成员函数可以直接访问基类的某个成员,说明该基类成员的访问权限是:
A. 公有或私有 B. 私有 C. 保护或私有 D. 公有或保护
5. 在下列关键字中,不能用来表示继承方式的是:
A. private B. static C. public D. protected
6. 下列有关运算符重载的叙述中,正确的是:
A. 运算符重载是多态的一种表现
B. C++中可以通过运算符重载创造新的运算符
C. C++中所有运算符都可以作为非成员函数重载
D. 重载运算符时可以改变其结合性
7. 下列关于类定义的说法中,正确的是:
A. 类定义中包括数据成员与函数成员的声明
B. 类成员的缺省访问权限是保护的
C. 数据成员必须被声明为私有的
D. 成员函数只能在类体外进行定义
8. 建立一个有成员对象的派生类对象时,各构造函数体的执行顺序为:
A. 派生类 成员对象类 基类 B. 成员对象类 基类 派生类
C. 基类 成员对象类 派生类 D. 基类 派生类 成员对象类
9. C++中解决命名冲突的机制是:
A. 虚基类 B. 虚函数 C. 函数重载 D. 名字空间
10. 任意一个类,析构函数的个数最多是:
A. 不限个数 B. 1 C. 2 D. 3
11. 在类定义中,为说明成员的访问权限,private, protected, public 可以出现次数为:
A. 次数没有具体限定 B. 每种至多一次
C. public 至少一次 D. 每种至少一次
12. 下面关于访问类A的私有数据成员的说法,错误的是:
A. 类A的友元函数可以访问类A的私有成员。
B. 类A的友元类中的非静态成员函数可以访问类A的私有成员。
C. 类A的嵌套类中的非静态成员函数可以访问类A的私有成员。
D. 类A中的非静态成员函数可以访问类A的私有成员。
二、写出下面程序的运行结果(2题,每题10分)
1. #include
class A
{
public:
A( ) { cout<<"<1> A::A( ) "<
virtual ~A( ) { cout<<"<2> A::~A( )"<
virtual void g( ) { cout<<"<3> A::g( )"<
void h( ) { cout<<"<4> A::h( )"<
virtual void f( ) { g( ); h( ); }
};
class B:public A
{
public:
B( ) {cout<<"<5> B::B( ) "<
virtual ~B( ) {cout<<"<6> B::~B( )"<
virtual void g( ) {cout<<"<7> B::g( )"<
void h( ) {cout<<"<8> B::h( )"<
virtual void k( ) { f( ); g( ); h( ); }
};
void main( )
{
B b;
b.k( );
}
2. #include
class A
{
public:
A( ) {cout<<1<
virtual ~A( ) {cout<<2<
virtual int Add(int n) {return 0;}
};
class B : public A
{
public:
B(int n):num(n) { }
virtual ~B( ) {}
virtual int Add(int n) {num+=n; return num;}
private:
int num;
};
class C : public A
{
public:
C(A& obj,int n) : a(obj), num(n) { cout<<3<
virtual ~C( ) { cout<<4<
virtual int Add(int n) { return a.Add(n+num); }
private:
A& a;
int num;
};
Int main ( )
{
B b(100);
C c1(b,1), c2(c1,2);
cout<
return0;
}
三、编程题(20分)
已知某程序中类MyString是自定义的一个用来描述字符串的类,它在main函数中使用情况如下:
void main( )
{
MyString s1("Hello ");
MyString s2("World!");
cout << s1.getString() << s2.getString( ) << endl;
MyString s3(s1);
cout << s3.getString( ) << endl;
s3 = s1 + s2;
cout << s3.getString( ) << endl;
}
程序执行时,输出结果如下:
Hello World!
Hello
Hello World!
根据以下已知条件,完成对MyString类的定义和实现。
(1) 可以使用iostream.h中定义的类及相关内容。
(2) 可以使用string.h中定义的如下函数:
int strlen(const char* ); 用于计算标准表示的字符串长度;
char* strcpy( char *strDestination, const char *strSource );用于将strSource串拷贝给strDestination。返回的是strDestination串,一般不用。
char* strcat( char *strDestination, const char *strSource );用于将strScource串接于strDestination串后。返回的是strDestination串, 一般不用。
本题目要求:根据上述已知条件,不借用其它标准函数库或类库,遵循上面程序输出结果,完成MyString类的定义和实现。