当前位置:首页 > 面向对象程序设计教程(C++语言描述)题解
初始值。函数体对形参的访问、修改都是在这个标识对象上操作的,与实参无关,即数据的传递是单向的。
使用引用作函数的形参时,调用函数的实参要用变量名。实参传递给形参,相当于在被调用函数中使用了实参的别名。于是,在被调用函数中对形参的操作实质是对实参的直接操作,即数据的传递是双向的。
(4) 内联函数有什么作用?它有哪些特点? 【问题解答】
内联函数是使用inline关键字声明的函数。在程序编译时,编译系统将程序中出现内联函数调用的地方用函数体进行替换,进而减少了程序运行的时间。
使用内联函数应注意以下几点。 ◆递归函数不能定义为内联函数。
◆内联函数一般适合于不含有switch和while等复杂的结构且只有1~5条语句的小函数,否则编译系统将该函数视为普通函数。
◆内联函数只能先定义后使用,否则编译系统也将该函数视为普通函数。
◆对内联函数也不能进行异常接口声明。 (5) 函数原型中的参数名与函数定义中的参数名以及函数调用中的参数名必须一致吗? 【问题解答】
不必一致。所有的参数是根据位臵和类型而不是名字来区分的。
(6) 重载函数时通过什么来区分? 【问题解答】
编译系统将根据函数参数的类型和个数来判断使用哪一个函数。
六、 程序分析题(写出程序的输出结果,并分析结果)
#include
cout<<\num=num+40;
cout<<\return 0; }
【输出结果】 num=60 ref=100 【问题分析】
本题主要考查引用的含义。 【结果分析】
程序首先定义一个int类型的对象num,并给它赋初始值50。然后又定义了一个int类型的引用ref,并将它和num相联系。这样,无论是对num还是对ref进行操作,实际上都是对那个一开始放着50的物理单元的内容进行操作。 七、 程序设计题
写出一个完整的C++程序,使用系统函数pow(x,y)计算xy的值,注意包含头文件cmath。 【问题分析】
本题主要考查简单的输入输出和标准库函数的调用方法。 【解题思路】
① 由于要用到系统函数pow(x,y),所以要包含头文件cmath。
② 要计算xy的值,首先必须知道x和y的值。为了程序的通用性,最好通过交互的方式输入x和y的值。 【参考程序】 // xt2_1.cpp #include
cout<<\,y:\cin>>x>>y;
float z=pow(x,y);
cout<<\(\,\)=\return 0;} 【输出结果】
please input 2 floats to x,y:3.1 2 pow(3.1,2)=9.61
第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:
<私有数据和函数>
共分享92篇相关文档