面向对象技术与C++(1)答案
《面向对象技术与C++》试卷答案(1)
第一题填充题 (10分,每1个空格1分)
1.通过对象名或对象引用调用其类成员函数使用运算符(.),而通过指向对象的指针调用
其类成员函数使用运算符(->)。
2.指定为(private)访问属性的类成员只能被本类的成员函数或其他友元函数调用。
3.动态分配一个int类型对象所需的存储空间使用运算符(new),返回值的类型为(int*)。
4.如果没有为类的成员对象提供成员初始化值,那么该对象的(缺省)构造函数将被调用。
5.派生类的构造函数是在其基类的构造函数执行之(后)执行的。
6.使用类的运算符重载不能改变运算符的(优先级)和(结合律) 。
7.类的成员函数定义为=0表示该函数是一个(纯虚函数)。
第二题指出下列程序段中的错误,并说明错误原因(10分,每1小题5分) 1.class Date { //表示日期的类声明
public:
void Date(int,int,int); //第1个参数年份,第2个参数为月份,第3个参数为日
// 其他成员函数的原型说明
private:
void Date(int=2013,int=05,int=01);
int year = 2013 , month = 05 , day = 01;
}
1) void Date Date(int=2013,int=05,int=01); 构造函数的访问属性应为public
2) 两个构造函数都不能指定返回类型
3)两个构造函数的重载关系不正确
4)int year= 2013 , month = 05 , day = 01; 不能直接给数据成员赋初值
5)最后少了一个分号(;)
2.class Example {
public:
Example(int y=100) : data(y) { }
int getIncrementedData() const { return data++; }
static int getCount() { cout<< “Data is “ << data < private: int data; static int count; }; 1) const函数getIncrementedData()不能修改成员数据data 2) static函数getCount()不能访问非static成员data 3) static数据成员count需要在类说明的外部初始化 第三题选择题 (10分,每1个空格1分) 1.C++类体系中,不能被派生类继承的有(B)(E)。 [A] 转换函数 [B] 构造函数 [C] 虚函数 [D] 静态成员函数 [E] 赋值运算符函数 2.定义类T的对象O的正确方法是(A)(E)。 [A] T O; [B] T O( ); [C] O T; [D] O T( ); [E] T O(1); 3. 在派生类中重新定义虚函数时必须在(A)(B)方面与基类保持一致。 [A] 参数个数 [B] 参数类型 [C] 参数名字 [D] 操作内容 [E] 赋值 4. 对于类C 的类型转换运算符函数,下列说明正确的是(C) [A] void operator C(double=1.0); [B] void operator C(); [C] operator double(); [D] ~C(double a=1.0); 5. 重载函数调用运算符operator( )时,应将其声明为类的(C)函数。 [A] 非成员 [B] 虚 [C] 成员 [D] 多态 6. 在VC++中,C++源文件的扩展名为(A) [A] .cpp [B] .obj [C] .lib [D] .exe 7. 定义析构函数时,应该注意(C) [A] 其名与类名完全相同 [B] 返回类型是void类型 [C] 无形参,也不可重载 [D] 函数体中必须有delete语句 第四题简答题(10分) 比较C++的new和delete运算符与C标准库函数malloc和free的异同。 相同点:用于动态内存分配和内存释放 不同点:new和delete是运算符,而malloc和free是标准库函数;new的操作数是数据类型,不需要指定存储空间大小的字节数,而malloc需要指定存储空间大小的字节数;new返回的是申请类型的指针,而malloc返回的是void*,需要通过强制类型转换把指针转换成申请类型的指针。 总的来说,new和delete使用更简单、更安全,也更灵活。 第五题写出以下程序运行时的输出结果(10分) #include using namespace std; class A { public: virtual void write() { cout << "class A \n"; } }; class B: public A { void write() { cout << "class B \n"; } }; class C: public A { void write() { cout << "class C\n"; } }; class D: public C { B m; }; class E: public B { C m; }; int main( ) { A a; B b; C c; D d; E e; A* p[ ] = {&a,&b,&c,&d,&e}; for (int i=0;i<5;i++) p[i]->write(); return 0; } class A class B class C class C class B 第六题写出以下程序运行时的输出结果(10分) #include using namespace std; class A { public: A( ) { cout << "构造类A对象"< ~A( ) { cout << "析构类A对象"< { public: B ( ) { cout << "构造类B对象"< ~B( ) { cout << "析构类B对象"< class C : public B {public: C( ) { cout << "构造类C对象"< ~C( ) { cout << "析构类C对象"< }; A obj; int main( ) { B obj2; C* p=new C; cout << endl; static A sa; { B obj2; } cout << endl; delete p; cout << endl; return 0; } 构造类A对象 构造类A对象 构造类B对象 构造类A对象 构造类B对象 构造类A对象 构造类C对象 构造类A对象 构造类A对象 构造类B对象 析构类B对象 析构类A对象 析构类C对象 析构类A对象 析构类B对象 析构类A对象 析构类B对象 析构类A对象 析构类A对象 析构类A对象 第七题编程题(10分) 编写一个名称为isSorted的函数模板确定其三个同类型参数值是否是按从小到大次序排列的。如果是,返回true;否则,返回false。 template 第八题编程题(30分) 定义并实现表示由字符元素组成的集合类型CharSet。 需提供的操作至少应包括: ●构造函数 ●析构函数 ●插入元素( insert 函数) ●集合并运算( + 运算符) ●集合显示输出( << 运算符) 集合显示输出的格式为{c1,c2,…},空集的输出为{}。 CharSet类型的使用例子如下: /*********************************************************/ /* testCharSet.cpp */ /*********************************************************/ #include using namespace std; #include "charset.h" int main() { CharSet s1(100), s2(100); for (char c=’A’;c<=’P’;c++) { s1.insert(c); s2.insert(c+5); } // 插入元素 cout << s1 << " ∪ " << s2 << " = " << s1 + s2 << endl; //集合并return 0; } /*********************************************************/ /* charset.h */ /*********************************************************/ #ifndef CHARSET_H #define CHARSET_H class CharSet { int cursize,maxsize; char *x; bool member(char t) const; public: CharSet(int m = 100); CharSet(const CharSet&); ~CharSet(); void insert(char t); friend ostream& operator<<(ostream&,const CharSet&); CharSet operator+(const CharSet&); }; #endif /*********************************************************/ /* charset.cpp */ /*********************************************************/ #include #include using namespace std; #include "charset.h" CharSet::CharSet(int m) { if (m<1) exit(1); cursize=0; x=new char[maxsize=m]; } CharSet::CharSet(const CharSet& m) { cursize=m.cursize; x=new char[maxsize=m.maxsize]; for (int i=0;i } CharSet::~CharSet() { delete x; } bool CharSet::member(char t) const { int l=0; int u=cursize-1; while (l<=u) { int m=(u+l)/2; if (t } void CharSet::insert(char t) { if (member(t)) return; if (cursize>=maxsize) exit(1); x[cursize++]=t; for (int i=cursize-1;i>0;i--) if (x[i] } ostream& operator<<(ostream& os, const CharSet& is) { cout << "{"; if (is.cursize>0) { for (int i=0;i cout << "}"; return os; } CharSet CharSet::operator+(const CharSet& anotherset) { CharSet r=*this; for (int i=0;i }