面向对象技术与C++(1)答案

面向对象技术与C++(1)答案
面向对象技术与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 bool isSorted(T a, T b, T c) { return a>=b && b>=c; }

第八题编程题(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 (tx[m]) l=m+1; else return true; } return false;

}

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

}

相关主题
相关文档
最新文档