第3章 类 与 对 象 一、 填空题
(1) 类定义中关键字private、public和protected以后的成员的访问权限分别是私有、公有和保护。如果没有使用关键字,则所有成员默认定义为private权限。具有public访问权限的数据成员才能被不属于该类的函数所直接访问。 (2) 定义成员函数时,运算符“∷”是作用域运算符,“MyClass∷”用于表明其后的成员函数是在“MyClass类”中说明的。
(3) 在程序运行时,通过为对象分配内存来创建对象。在创建对象时,使用类作为样板,故称对象为类的实例。
(4) 假定Dc是一个类,则执行“Dc a[10],b(2)”语句时,系统自动调用该类构造函数的次数为11。 【结果分析】
创建10个数组元素需调用构造函数10次,创建对象b需调用构造函数1次,所以系统自动调用该类构造函数的总次数为11。
(5) 对于任意一个类,析构函数的个数最多为1个。
(6) delete运算符通常用于实现释放该类对象中指针成员所指向的动态存储空间的任务。 (7) C++程序的内存格局通常分为4个区: 数据区、代码区、栈区和堆区。
(8) 数据定义为全局变量,破坏了数据的 封装性; 较好的解决办法是将所要共享的数据定义为类的 静态成员。
(9) 静态数据成员和静态成员函数可由 任意访问权限许可的函数访问。
(10) 友元函数和 友元类统称为友元。 (11) 友元的正确使用能提高程序的效率,但破坏了类的封装性和数据的隐蔽性。
(12) 若需要把一个类A定义为一个类B的友元类,则应在类B的定义中加入一条语句: friend class A;。
二、 选择题(至少选一个,可以多选) (1) 以下不属于类访问权限的是( B )。 A. public B. staticC. protectedD. private 【结果分析】
类的访问权限有public、protected 和private。 (2) 有关类的说法不正确的是( BC )。 A. 类是一种用户自定义的数据类型
B. 只有类的成员函数才能访问类的私有数据成员 C. 在类中,如不做权限说明,所有的数据成员都是公有的
D. 在类中,如不做权限说明,所有的数据成员都是私有的 【结果分析】
类是一种用户自定义的数据类型,类中成员均具有一种访问权限。关键字public、protected 和private以后的成员的访问权限分别是公有、保护和私有的,所有成员默认定义为private的。 私有成员是被隐藏的数据,只有该类的成员函数或友元函数才可以访问它。
(3) 在类定义的外部,可以被任意函数访问的成员有( C )。
A. 所有类成员 B. private或protected的类成员
C. public的类成员 D. public或private的类成员 【结果分析】
类是一种用户自定义的数据类型,类中成员均具有一种访问权限。公有成员定义了类的外部接口。私有成员是被隐藏的数据,只有该类的成员函数或友元函数才可以引用它。保护成员具有公有成员和私有成员的双重性质,可以被该类或派生类的成员函数或友元函数引用。可见在类定义的外部,可以被任意函数访问的成员是public的类成员。 (4) 关于类和对象的说法( C )是错误的。 A. 对象是类的一个实例
B. 任何一个对象只能属于一个具体的类 C. 一个类只能有一个对象
D. 类与对象的关系和数据类型与变量的关系相似 【结果分析】
C++语言的类就是一种用户自己定义的数据类型,类和对象的关系就相当于基本数据类型与它的变量的关系,所以任何一个对象只能属于一个具体的类,但一个类可以有多个对象。
(5) 设MClass是一个类,dd是它的一个对象,pp是指向dd的指针,cc是dd的引用,则对成员的访问,对象dd可以通过( B )进行,指针pp可以通过( D )进行,引用cc可以通过( B )进行。
A. ∷ B. . C. & D. ->
(6) 关于成员函数的说法中不正确的是( C )。 A. 成员函数可以无返回值
B. 成员函数可以重载 C. 成员函数一定是内联函数 D. 成员函数可以设定参数的默认值 【结果分析】
与普通函数不同的是,成员函数是属于某个类的。成员函数的实现,可以放在类体内,也可以放在类体外。在类体外实现的成员函数不再是内联函数。 (7) 下面对构造函数的不正确描述是( B )。 A. 系统可以提供默认的构造函数
B. 构造函数可以有参数,所以也可以有返回值 C. 构造函数可以重载 D. 构造函数可以设臵默认参数 【结果分析】
构造函数不能指定返回类型,即使是void类型也不可以,当然不可能有返回值。
(8) 假定A是一个类,那么执行语句“A a,b(3),*p; ”调用了( B ) 次构造函数。 A. 1 B. 2 C. 3 D. 4
【结果分析】
声明指针是不会调用构造函数的。
(9) 下面对析构函数的正确描述是( AC )。 A. 系统可以提供默认的析构函数 B. 析构函数必须由用户定义 C. 析构函数没有参数 D. 析构函数可以设臵默认参数 【结果分析】
析构函数的作用是在对象消失时执行一项清理任务。如果一个类中没有定义析构函数,系统将自动生成一个默认析构函数。析构函数没有参数,当然不可能设臵默认参数。
(10) 类的析构函数是( D )时被调用的。 A. 类创建 B. 创建对象 C. 引用对象 D. 释放对象
(11) 创建一个类的对象时,系统自动调用( B ); 撤销对象时,系统自动调用( C )。
A. 成员函数 B. 构造函数 C. 析构函数 D. 复制构造函数
(12) 通常拷贝构造函数的参数是( C )。 A. 某个对象名 B. 某个对象的成员名
C. 某个对象的引用名 D. 某个对象的指针名
(13) 关于this指针的说法正确的是( B )。
A. this指针必须显式说明B. 当创建一个对象后,this指针就指向该对象
C. 成员函数拥有this指针D. 静态成员函数拥有this指针。 【结果分析】
this指针是由C++编译器自动产生且较常用的一个隐含对象指针,它不能被显式声明。当创建一个对象时,this指针就初始化指向该对象。但只有非静态成员函数才拥有this指针,并通过该指针来处理对象。
(14) 下列关于子对象的描述中,( B )是错误的。
A. 子对象是类的一种数据成员,它是另一个类的对象
B. 子对象可以是自身类的对象
C. 对子对象的初始化要包含在该类的构造函数中 D. 一个类中能含有多个子对象作其成员 【结果分析】
子对象不可以是自身类的对象。
(15) 对new运算符的下列描述中,( B )是错误的。
A. 它可以动态创建对象和对象数组 B. 用它创建对象数组时必须指定初始值 C. 用它创建对象时要调用构造函数
D. 用它创建的对象数组可以使用运算符delete来一次释放 【结果分析】
使用运算符new创建对象数组的格式如下:
new <类型说明符> [<算术表达式>]
其中,<算术表达式>给出数组的大小,后面不能再跟构造函数参数,所以用它创建对象数组时不能指
定初始值。
(16) 对delete运算符的下列描述中,( D )是错误的。
A. 用它可以释放用new运算符创建的对象和对象数组
B. 用它释放一个对象时,它作用于一个new所返回的指针
C. 用它释放一个对象数组时,它作用的指针名前须加下标运算符[ ]
D. 用它可一次释放用new运算符创建的多个对象 【结果分析】
用delete一次只能释放用new创建的1个对象,但可释放一个对象数组。
(17) 关于静态数据成员,下面叙述不正确的是( C )。
A. 使用静态数据成员,实际上是为了消除全局变量
B. 可以使用“对象名.静态成员”或者“类名∷静态成员”来访问静态数据成员
C. 静态数据成员只能在静态成员函数中引用 D. 所有对象的静态数据成员占用同一内存单元 【结果分析】
静态数据成员可以在静态成员函数中引用,也可以在非静态成员函数中引用。
(18) 对静态数据成员的不正确描述是( CD )。 A. 静态成员不属于对象,是类的共享成员 B. 静态数据成员要在类外定义和初始化 C. 调用静态成员函数时要通过类或对象激活,所以静态成员函数拥有this指针
D. 只有静态成员函数可以操作静态数据成员 【结果分析】
this指针是一个局部量,局部于某个对象,而静态成员函数是属于整个类而不是某个对象,它没有this指针。静态成员函数和非静态成员函数均可操作静态数据成员。
(19) 下面的选项中,静态成员函数不能直接访问的是( D )。
A. 静态数据成员 B. 静态成员函数
C. 类以外的函数和数据 D. 非静态数据成员 【结果分析】
由于静态成员函数没有this指针,它只能直接访问该类的静态数据成员、静态成员函数和类以外的函数和数据,访问类中的非静态数据成员必须通过参数传递方式得到对象名,然后通过对象名来访问。
(20) 在类的定义中,引入友元的原因是( A )。 A. 提高效率 B. 深化使用类的封装性
C. 提高程序的可读性 D. 提高数据的隐蔽性 【结果分析】
友元的作用主要是为了提高效率和方便编程,但友元破坏了类的封装性和隐蔽性,使用时要权衡利
弊。
(21) 友元类的声明方法是( A )。
A. friend class<类名>; B. youyuan class<类名>;
C. class friend<类名>; D. friends class<类名>;
(22) 下面对友元的错误描述是( D )。 A. 关键字friend用于声明友元
B. 一个类中的成员函数可以是另一个类的友元 C. 友元函数访问对象的成员不受访问特性影响 D. 友元函数通过this指针访问对象成员 【结果分析】
友元函数是一个放在类中的普通函数,它没有this指针。
(23) 下面选项中,( C )不是类的成员函数。 A. 构造函数 B. 析构函数 C. 友元函数 D. 拷贝构造函数 三、 简答题
(1) 类与对象有什么关系? 【问题解答】
类是一种用户自己定义的数据类型,和其他数据类型不同的是,组成这种类型的不仅可以有数据,而且可以有对数据进行操作的函数。程序员可以使用这个新类型在程序中声明新的变量,具有类类型的变量称为对象。创建对象时,类被用做样板,对象称为类的实例。
(2) 类定义的一般形式是什么?其成员有哪几种访问权限? 【问题解答】 定义类一般形式为:
class类名{ public:
<公有数据和函数>
protected:
<保护数据和函数>
private:
<私有数据和函数>
};
访问权限共有3种: 分别是公有(public)、保护(protected)和私有(private)。
(3) 类的实例化是指创建类的对象还是定义类? 【问题解答】 指创建类的对象。
(4) 什么是this指针?它的主要作用是什么? 【问题解答】
this指针是C++语言为成员函数提供的一个隐含对象指针,它不能被显式声明。this指针是一个局部量,局部于某个对象。不同的对象调用同一个成员函数时,编译器根据this指针来确定应该引用哪一个对象的数据成员。
(5) 什么叫做拷贝构造函数?拷贝构造函数何时被调用? 【问题解答】
拷贝构造函数是一种特殊的构造函数,它的作用是用一个已经存在的对象去初始化另一个对象。为了保证所引用的对象不被修改,通常把引用参数声明为const参数。
在以下3种情况下,拷贝构造函数都会被自动调用: ◆当用类的一个对象去初始化该类的另一个对象时;
◆当函数的形参是类的对象,进行形参和实参结合时;
◆当函数的返回值是类的对象,函数执行完成返回调用者时。
四、 程序分析题(写出程序的输出结果,并分析结果) (1)
#include
using namespace std;
class Test { private: int num;
public:
Test();// 默认构造函数
Test(int n); // 带一个参数构造函数 };
Test∷Test() {
cout<<\ num=0; }
Test∷Test(int n) {
cout<<\ num=n; }
int main() {
Test x[2];// 语句1
Test y(15); // 语句2
return 0; }
【输出结果】
Init defa
Init defa Init 15
【问题分析】
本题主要考查构造函数的调用时机和构造函数的匹配问题。 【要点提示】
构造函数在创建对象时被自动调用,具体调用哪个构造函数将由编译系统根据重载函数的匹配原则来确定。 【结果分析】
① 程序声明了2个对象x和y,类中有2个构造函数。
② 程序首先执行语句1,创建对象x,调用默认构造函数。由于对象x是对象数组,每个数组元素被创建时都要调用构造函数,所以默认构造函数被调用了2次,输出第1、2行结果。程序接着执行语句2,创建对象y,调用带一个参数的构造函数,输出第3行结果。 (2)
#include
using namespace std; class Xx { private: int num; public:
Xx(int x){num=x;} // 构造函数
~Xx(){cout<<\析构函数 };
int main() {
Xx w(5); // 语句1
cout<<\语句2
return 0; }
【输出结果】
Exit main dst 5
【问题分析】
本题主要考查析构函数的调用时机。 【要点提示】
析构函数在释放对象时被自动调用。 【结果分析】
① 程序声明了一个对象w。
② 程序首先执行语句1,创建对象w,调用构造函数,num得到初值5。程序接着执行语句2,输出第1行结果。当程序结束时,释放对象w,析构函数被调用,输出第2行结果。
(3) 将例3.10中的Whole类如下修改,其他部分不变,写出输出结果。
class Whole { public:
Whole(int i); // Whole的有参构造函数
Whole(){}; // Whole的无参构造函数
~Whole(); // Whole的析构函数
private:
搜索“diyifanwen.net”或“第一范文网”即可找到本站免费阅读全部范文。收藏本站方便下次阅读,第一范文网,提供最新人文社科面向对象程序设计教程(C++语言描述)题解 (2)全文阅读和word下载服务。
相关推荐: