DYc++类与对象习题答案

更新时间:2023-12-07 22:46:01 阅读量: 教育文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

1. 概念填空题

1.1 类定义的关键字是 class 。类的数据成员通常指定为 私有 成员。类的函数成员通常指定为 公有 成员,指定为 公有 的类成员可以在类对象所在域中的任何位置访问它们,类的 私有和保护 只能被该类的成员函数或友元函数访问。

1.2类的访问限定符包括 public、 private 和 protected 。类成员默认的访问方式是 private 。访问限定符在类中 无 先后次序,各限定符 允许 (允许/不允许)多次出现。

1.3 构造函数的任务是 建立对象 。类中可以有 多 个构造函数,它们由 参数 区分。如果类说明中没有给出构造函数,则C++编译器会提供构造函数,该函数 不完成 (完成/不完成)对象初始化工作。

1.4复制构造函数的参数是 对象的复制 ,当程序没有给出复制构造函数时,编译系统会提供 默认复制构造函数 ,完成类对象的 复制 。复制构造函数被调用情况有 3 种。

1.5析构函数在对象 释放 时被自动调用。类中没有定义析构函数时,编译系统会提供一个默认的析构函数。该函数 不完成 (完成/不完成)具体对象的清理工作。

2. 简答题

2.1 为什么说类与对象的概念是客观世界的反映?

答:客观世界的事物都具有某些属性和行为(或操作),具有相同属性和行为的事物可以归属于一类,用分类的方法可以提高认识事物的效率。C++中定义的类则是通过抽象的方法将某一类事物共有的静态特征(属性)和动态特征(行为)概括出来并加以描述,而对象是类的具体实现,所以说类与对象的概念是客观世界的反映。

2.2 简单解释什么是面向对象程序设计的封装性。

答:对象是一个封装体,在其中封装了该对象所具有的属性和操作。对象作为独立的基本单元,实现了将数据和数据处理相结合的思想。此外,封装特性还体现在可以限制对象中数据和操作的访问权限,从而将属性“隐藏”在对象内部,对外只呈现一定的外部特性和功能。

封装性增加了对象的独立性,C++通过建立数据类型——类,来支持封装和数据隐藏。一个定义完好的类一旦建立,就可看成完全的封装体,作为一个整体单元使用,用户不需要知道这个类是如何工作的,而只需要知道如何使用就行。另一方面,封装增加了数据的可靠性,保护类中的数据不被类以外的程序随意使用。这两个优点十分有利于程序的调试和维护。

2.3 引用作为函数参数时为什么能实现两个实参之间的数据交换?为什么对应实参不能为引用?为什么返回值为引用的函数可以作为左值?

答:引用变量是其关联变量的别名,二者在内存中占据同一个存储单元。在一个以引用作为参数的函数中,交换两个参数的值,实际上就是交换两个实参的值。如果函数的参数是引用,调用时需要取得实参的地址,而实参如果已经是一个地址,再进行引用将产生错误,故对应实参不能为引用。

函数返回引用实际是指明(返回)了相应的关联变量,所以声明返回值为引用的函数实际上是将关联变量作为左值参与运算。

2.4 什么是默认的构造函数?默认的构造函数可以有多少个?

答:默认构造函数就是在没有显式提供初始化式时调用的函数。最多可以有一个。

2.5 为什么在友元函数的函数体内访问对象成员时,必须用对象名加运算符“.”再加对象成员名?

答:友元函数不是类的成员函数,在函数体中访问对象的成员,必须用对象名加运算符“.”加对象成员名。这一点和一般函数一样。

2.6 类的静态数据成员与函数中的静态成员有何异同?

答:类的静态成员为其所有对象共享,不管有多少对象,静态成员只有一份存于公用内存中,为该类所有对象公用。函数中的静态变量也位于公用内存中,不随函数调用而重新分配,所以总是保留上次进入并执行该函数

1

后留下的信息。

2.7 类的成员函数在什么情况下应该定义为私有的?这样做的目的是什么?

答:除接口函数和创建本类对象的构造函数和撤消该对象的析构函数外。其余成员函数应该定义为私有的,这是开发类时故意对外隐蔽起来的操作,而这些往往是最复杂最关键的部分。类中故意的隐藏也为以后的升级扩展留下了余地,只要接口不变,内部再变,也不必修改原来的程序,就象MFC(微软基础类)升级后,由MFC底层类所编的程序完全不必修改,自动升级。

2.8 友元关系有何性质?友元关系的优点和缺点各有哪些?

答:友元是C++提供的一种破坏数据封装和数据隐藏的机制。

通过讲一个模块声明为另一个模块的友元,一个模块能够引用到另外一个模块中本是被隐藏的信息,可以使用友元函数和友元类。为了确保数据的完整性,及数据封装与隐藏的原则, 建议尽量不使用或少使用友元。

3.选择题

3.1 数据封装就是将一组数据和与这组数据有关操作组装在一起,形成一个实体,这实体也就是( B )。 A.类 B.对象 3.2 类的实例化是指( B )。

C.函数体

D.数据块

D.调用类的成员

A.定义类 B.创建类的对象 3.3下列说法中正确的是( B )。

C.指明具体类

A.类定义中只能说明函数成员的函数头,不能定义函数体

B.类中的函数成员可以在类体中定义,也可以在类体之外定义

C.类中的函数成员在类体之外定义时必须要与类声明在同一文件中 D.在类体之外定义的函数成员不能操作该类的私有数据成员 3.4有如下类定义: class sample { int n; public: sample (int i=0):n(i){ }

void setValue(int n0); };下列关于setValue成员函数的实现中,正确的是( B )。

A.sample::setValue(int n0){n=n0;}

B.void sample::setValue(int n0){n=n0;} C.void setValue(int n0){n=n0;} D.setValue(int n0){n=n0;}

3.5在下面的类定义中,错误的语句是( C )。 class sample{ public:

sample(int val);

//①

~sample( ); //② private: int a=2.5; //③ public: sample( ); //④

}; A.① B.② C.③ D.④

3.6类的构造函数被自动调用执行的情况是在创建该类的(C)。

2

A.成员函数时 B.数据成员时 C.对象时 D.友元函数时 3.7(A)是析构函数的特征。

A.一个类中只能定义一个析构函数

B.析构函数名与类名不同

C.析构函数的定义只能在类体内 D.析构函数可以有一个或多个参数

3.8 在下列函数原型中,可以作为类AA构造函数的是( D )。 A.void AA(int); B.int AA( ); C.AA(int) const; D.AA(int) 3.9关于成员函数特征的下述描述中,(A)是错误的。 A.成员函数一定是内联函数 B.成员函数可以重载

C.成员函数可以设置参数的默认值 D.成员函数可以是静态的

3.10不属于成员函数的是(B )。

A.静态成员函数 B.友元函数 C.构造函数 D.析构函数

3.11已知类A是类B的友元,类B是类C的友元,则(C )。 A.类A一定是类C的友元

B.类C一定是类A的友元

C.类C的成员函数可以访问类B的对象的任何成员 D.类A的成员函数可以访问类B的对象的任何成员 3.12有如下类定义:

class AA{ int a; public: int getRef( ) const {return &a;} //①返回类型为int, return &a为地址

int getValue( ) const {return a;}

//②

//③常函数不能修改成员

//④友元函数不能是常函数

void set(int n) const{a=n;} friend void show(AA aa) const {cout<

其中的四个函数定义中正确的是(B)。 A. ① 3.13有如下类定义:

B.②

C.③ D.④

class Test{ public: Test( ){a=0;c=0;}

//①常成员必须在初始化列表中初始化 //②常函数不能修改成员 //③

//④静态函数要通过对象访问成员

int f(int a) const {this->a=a;} void h(int b) {Test::b=b;}; static int g( ) {return a;} int a;

static int b;

private:

const int c; };

3

int Test::b=0;

在标注号码的行中,能被正确编译的是(C)。

A.①

B.② C. ③

D.④

4写出程序程序执行结果。 4.1#include using namespace std; class Test { public:

Test( )

{ n+=2; }

~Test( ) { n-=3;} static int getNum( ) { return n;} private: static int n; };

int Test::n=1; int main( ){ Test* p = new Test; delete p;

cout<<”n=”<

}

n=0

4.2#include using namespace std; class AA{ int n; public:

AA(int k):n(k){}

int get( ) {return n;} int get( ) const{ return n+1;} };

int main( ){ AA a(5);

const AA b(6);

cout<

}

5 7

4.3#include using namespace std; class MyClass { public:

int number;

void set(int i);

};

4

int number=3;

void MyClass::set (int i){ }

number=i;

void main( ){ MyClass my1; int number=10; }

my1.set(5);

cout<

10 3

4.4#include using namespace std; class Test{ private:

static int val; int a; public:

static int func( ); void sfunc(Test &r);

};

int Test::val=200; int Test::func( ){ return val++; }

void Test::sfunc(Test &r){ r.a=125; cout<<\}

void main( ){ cout<<\ }

Test a;

cout<<\a.sfunc(a); Result1=200

Result2=201 Result1==125 5.编程题

5.1 构造一个日期时间类(Timedate),数据成员包括年、月、日和时、分、秒,函数成员包括设置日期时间和输出时间,其中年、月用枚举类型,并完成测试(包括用成员函数和用普通函数)。 #include

5

本文来源:https://www.bwwdw.com/article/od6t.html

Top