复习
一、选择题
1. 通常,拷贝构造函数的参数是( C)
A.某个对象名
B.某个对象的成员名
C.某个对象的引用名
D.某个对象的指针名
2. 在公有继承的情况下,基类成员在派生类中的访问权限( A)
A.受限制
B.保持不变
C.受保护
D.不受保护
3. 如果类 A 被说明成类 B 的友元,则(D )
A.类 A 的成员即类 B 的成员
B.类 B 的成员即类 A 的成员
C.类 A 的成员函数不得访问类 B 的成员
D.类 B 不一定是类 A 的友元
4. 假定要对类 A 定义加号操作符重载成员函数,实现两个 A 类对象的加法,并返回相加结
果,则该成员函数的声明语句为( B )
A.A operator+(A & a , A & b)
B.A operator+(A & a)
C.operator+(A a)
D.A & operator+( )
5. ( B )封装捕获到异常时所执行的代码
A.try 块 B.catch 块 C.throw D.exception
6. 关于静态数据成员下列错误的是(D )
A.说明静态数据成员时前边要加修饰符 static
B.静态数据成员要在类体外进行初始化
C.在类外引用公有静态的数据成员时,要在静态数据成员前加类名和作用域运算符
D.静态数据成员不是所有对象所共享的
7. 已知:类 A 中一个成员函数说明如下 void Set(A &a);其中,A &a
的含义是( C )
A.定义指向类 A 的指针为 a
B.将 a 的地址值赋给变量 Set
C.a 是类 A 的对象引用,用来做函数 Set()的参数
D.变量 A 与 a 按位相与作为函数 Set()的参数
8. 下列 C++程序段,(BC )是有错误的或可能给程序的运行带来隐含的错误(选择两项)
A. int *p = new int;
*p = 10;
cout << *p;
delete p;
B. int *p = new int;
p = 100;
delete p;
C. int *ptr = new int[20];
delete ptr;
D. int *ptr = new int[20];
delete [] ptr;
9. 下面 C++程序运行的结果是(D )
#include
void func(int x)
{
x++;
cout << x << ” “;
}
void main()
{
int x = 5;
func(x);
cout << x << endl;
}
A.5 5
B.6 5
C.6 6
D.5 6
二、判断题
1.具有转换函数功能的构造函数,是指只能带有一个或两个参数的构造函数。( )
2.友元函数是类的成员函数,所以可以存取或修改该类中的私有成员。( F)
3.重新定义的标识符在定义它的区域内是可见的,而与其同名的原标识符在此区域内是不
可见的但是却是存在的。( )
4. 已知:类 A 中一个成员函数说明如下:void Set(A& a);其中 A& a 的含意是将 a 的地址
值赋给变量 Set。( )
三、填空题
1. 类的______数据成员____通常定义为 private 类型,而类的__成员函数________通常定义
为 public 类型
2. 类可以由其他类的______________组成。
3. _______是通过虚函数实现的。
4. ____________指针引用对象的非静态成员函数和非静态数据成员。
四、阅读代码
1.
#include
using namespace std;
class base
{
int n;
public:
base(int a)
{
cout << "constructing base class" << endl;
n = a;
cout << "n = " << n << endl;
}
~base(){cout << "destructing base class" << endl;}
class subs : public base
{
base bobj;
int m;
public:
subs(int a, int b, int c) : base( a ), bobj( c )
{
cout << "constructing sub class" << endl;
m = b;
cout << "m = " << m << endl;
}
~subs(){cout << "destructing sub class" << endl;}
};
};
}
int main()
{
subs s(1, 2, 3);
return 0;
2.
#include
#include
using namespace std;
class Oyster {
public:
Oyster( string genusString)
{
genus = genusString;
}
string getPhylum() const
{
return “Mollusca”;
}
virtual string getName() const
{
return “Oyster class”;
}
string getGenus() const
{
return genus;
}
virtual void print() const = 0;
private:
string genus;
};
class VirginiaOyster : public Oyster {
public:
VirginiaOyster() : Oyster( “Crassostrea” )
{
}
virtual string getName() const
{
return “VirginiaOyster class”;
}
virtual void print() const
{
cout << "Phylum: " << getPhylum().c_str()
<< "\tGenus: " << getGenus().c_str()
<< "\tName: " << getName().c_str();
}
};
int main()
{
VirginiaOyster oyster;
Oyster *baseClassPtr;
baseClassPtr = &oyster ;
baseClassPtr->print() ;
cout << endl ;
return 0;
#include
#include
using namespace std;
}
3.
: out( "EXCEPTION: Division by zero attempted." )
class DivideZero {
public:
DivideZero()
{
}
string display() const
{
return out;
}
private:
string out;
};
double arithmetic( int n, int d )
{
if( d == 0 )
throw DivideZero();
return static_cast< double > ( n ) / d;
}
int main()
{
try {
}
cout << arithmetic ( 24, 6 ) << endl;
cout << arithmetic ( 1, 3 ) << endl;
cout << arithmetic ( 9, 0 ) << endl;
catch ( DivideZero &e ) {
cout << e.display() << endl;
}
return 0;
}
五、简答题
1.请指出下列程序片断中的错误。并解释错在何处:
int index = 255;
const int *ptr = &index;
int *const ntptr = &index;
*ptr = 430;
*ntptr = 4330;
int another = 5;
ptr = &another;
ntptr = &another;
(A)
(B)
(C)
(D)
2.运行下面的 Test 函数会有什么样的结果
void Test(void)
{
char *str = (char *)malloc(100);
strcpy(str, “hello”);
free(str);
if( str != NULL)
{
strcpy(str, “world”);
printf(str);
}
}
3.什么是类?类与对象的区别是什么?
4.什么是多态?在 C++中多态是如何实现的?
六、编程题
1. 编写类String 的构造函数、析构函数和赋值函数
String(const char *str = NULL);
String(const String &other);
~ String(void);
String & operate =(const String &other);
class String
{
public:
private:
char *m_data;
};
请编写 String 的上述 4 个函数。
2. 下面是一个类的测试程序,请写出被测试的 Test 类的实现。
int main()
{
Test a;
a.init(68,55);
a.print();
return 0;
}
其执行结果为: “测试结果:68-55=13”