当前位置:文档之家› 面向对象技术与C++(3)答案

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

《面向对象技术与C++》试卷答案(3)第一题填充题(10分,每1个空格1分)1.当使用带参数的流操纵算子时,程序中必须包含(iomanip)头文件。

2.复合对象中的成员对象是在建立复合对象之(前)建立的。

3.运算符new分配的动态内存要用运算符(delete) 回收。

如果在一个类的构造函数中使用new分配动态内存,则回收操作应在类的(析构)函数中完成。

4.struct成员的默认访问模式是(public),而class成员的默认访问模式是 (private)。

5.关键字(const) 指定了不可修改的对象或变量。

关键字(const) 指定一个类的成员不会修改类中的数据成员。

6.重载赋值运算符operator= 时,应将其声明为类的(成员)函数。

7.C++中的输入/输出是以字节(流) 的形式实现的。

第二题指出下列程序段中的错误,说明错误原因(10分,每1小题5分)1.class Rational { //表示有理数的类声明public:void Rational (int,int); //第1个参数为分子,第2个参数为分母// 其他成员函数的原型说明private:void Rational ( ); //默认的数为0,其分子表示为0,分母表示为1int a = 0 , b = 1;}1) void Rational(); 构造函数的访问属性应为public2) 两个构造函数都不能指定返回类型3)int a = 0 , b = 1; 不能直接赋初值4)最后少了一个分号(;)2.class myClass {public:myClass(char a, int b) { v = a ; si = b ; }void f1(int i = 10) const { v = v + i ; }static int f2() { return v + si; }private:char v;static int si;} ;1) static函数f2()不能访问非static成员v2) 构造函数中不能对static数据赋值3) const成员函数f1不能修改数据成员v4) static数据si需要在类声明的外面进行初始化第三题选择题 (10分,每1个空格1分)1.在VC++中,目标文件的扩展名为(B)[A] .cpp[B] .obj[C] .h[D] .exe2.通常情况下,模板函数的类型参数个数不能为(A)个。

[A] 0[B] 1[C] 2[D] 2个以上3.既要禁止修改指针p,又要禁止修改p所指的数据,则p的正确定义是(D)。

[A] const char* p=”xxxx”;[B] char* const p=”xxxx”;[C] char const *p=”xxxx”;[D] const char * const p=”xxxx”;4.若函数f是类C中的虚函数,类D是类C的公有派生类,则函数f在类D中是(A)。

[A] 总是虚函数[B] 只有重新声明时才是虚函数[C] 只有使用virtual关键字重新声明时才是虚函数[D] 不可能是虚函数5. 每个类(A)析构函数。

[A] 只能有一个[B] 只可有私有的[C] 可以有多个[D] 只可有缺省的6. 重载函数调用运算符operator[ ]时,应将其声明为类的(C)函数。

[A] 非成员[B] 虚[C] 成员[D] 多态7. static成员函数没有(B)。

[A] 返回值[B] this指针[C] 指针参数[D] 返回类型8. 设T是类名,则声明T a(); 表示a是(A)。

[A] 函数名[B] 对象名[C] 函数指针[D] 引用8. 设函数f是类A的虚函数,类B是类A的public派生类。

定义B d; A* p=&d; A& r=d; 则采用动态联编的是(B)和(E)。

[A] d.f();[B] p->f();[C] p.f();[D] r->f();[E] r.f();第四题简答题(10分)为什么编译器认为把基类指针转换为派生类指针是危险的?派生类指针指向基类对象。

这种方法是不安全的,因而需要避免。

因为通过派生类指针使用派生类自己添加的成员是可以的,但它所指的基类对象中并不存在这种成员。

第五题写出以下程序运行时的输出结果(10分)#include <iostream>using namespace std;class A {public:A() { cout << "initialize A\n"; }virtual void write() { cout << "class A \n"; }};class B: public A {public:B() { cout << "initialize B\n"; }void write() { cout << "class B \n"; }};class C: public B {public:C() { cout << "initialize C\n"; }void write() { cout << "class C\n"; }};class D: public C {public:D() { cout << "initialize D\n"; }};int main( ){ A a; B b; C c; D d;A* p[ ] = {&a,&b,&c,&d}; A arr[ ] = {a,b,c,d};for (int i=0;i<4;i++) { p[i]->write(); arr[i]. write(); }return 0;}initialize Ainitialize Ainitialize Binitialize Ainitialize Binitialize Cinitialize Ainitialize Binitialize Cinitialize Dclass Aclass Aclass Bclass Aclass Cclass Aclass Cclass A第六题写出以下程序运行时的输出结果(10分)#include <iostream>using namespace std;class A{ public: A( ) { cout << " AAA "; } ~A( ) { cout << " ~AAA "; } }; class B : public A{ public: B ( ) { cout << " BBB "; } ~B( ) { cout << " ~BBB "; } private: A m1,m2;};class C : public A{public: C( ) { cout << " CCC "; } ~C( ) { cout << "~CCC "; } private: B m1,m2;};A obj;B obj2;C obj3;int main( ){ C objc; B* p=new B; cout << endl; delete p;static A sa;return 0;}AAA AAA AAA AAA BBB AAA AAA AAA AAA BBB AAA AAA AAA BBB CCC AAAAAA AAA AAA BBB AAA AAA AAA BBB CCC AAA AAA AAA BBB~BBB ~AAA ~AAA ~AAA AAA ~CCC ~BBB ~AAA ~AAA ~AAA ~BBB ~AAA ~AAA ~AAA ~AAA ~AAA ~CCC ~BBB ~AAA ~AAA ~AAA ~BBB ~AAA ~AAA ~AAA ~AAA ~BBB~AAA ~AAA ~AAA ~AAA第七题编程题(10分)编写一个名称为sum的函数模板计算其三个同类型参数值的和。

template <class T> T sum(T a, T b, T c) { return a+b+c; }第八题编程题(30分)建立一个能安全使用的动态数组类DynamicArray。

所谓安全使用指数组下标越界时自动终止程序执行;所谓动态指数组的大小可在程序运行过程中确定,而不必要在编写程序时就确定下来。

给类提供能完成下列功能的函数:构造函数和拷贝构造函数;数组整体赋值和输出;下标运算符。

//dynamicarray.h#ifndef DYNAMICARRAY_H#define DYNAMICARRAY_H#include <iostream>using namespace std;class DynamicArray {friend ostream& operator<<(ostream&, const DynamicArray&);public:DynamicArray( int arraySize = 10 );DynamicArray( const DynamicArray& );~DynamicArray();const DynamicArray& operator= ( const DynamicArray& );int& operator[] ( int );private:int* ptr; int size;};#endif//dynamicarray.cpp#include <cstdlib>#include <cassert>using namespace std;#include "dynamicarray.h"DynamicArray::DynamicArray(int arraySize){ size = arraySize; ptr = new int[size]; assert( ptr != 0 );for (int i = 0 ; i < size ; i++ ) ptr[i] = 0;}DynamicArray::DynamicArray( const DynamicArray& init ){ size = init.size; ptr = new int[size]; assert( ptr != 0 );for (int i = 0 ; i < size ; i++ ) ptr[i] = init.ptr[i];}DynamicArray::~DynamicArray() { delete[] ptr; }int& DynamicArray::operator[]( int subscript){ assert ( 0 <= subscript && subscript < size );return ptr [ subscript ];}const DynamicArray& DynamicArray::operator= ( const DynamicArray& right ) { if ( this != &right ){ delete[] ptr; size = right.size; ptr = new int[size]; assert ( ptr != 0 );for ( int i = 0 ; i < size ; i++ ) ptr[i] = right.ptr[i];}return *this;}ostream& operator<<(ostream& output, const DynamicArray& a ){ for ( int i = 0 ; i < a.size ; i++ ) output << a.ptr[i] << ' ';return output;}。

相关主题