用列举法写出集合{(x,y)|y=-x²+6,x∈N,y∈N}?

【学习目标】掌握集合的定义,熟练运用集合的性质解题

(一)一般地,研究对象统称为元素,一些元素组成的总体叫集合,也简称集。

1. 关于集合的元素的特征

(1)确定性:设A 是一个给定的集合,x 是某一个具体对象,则或者是A 的元素或

者不是A 的元素,两种情况必有一种且只有一种成立。

(2)互异性:一个给定集合中的元素,指属于这个集合的互不相同的个体(对象),

因此,同一集合中不应重复出现同一元素。

(3)无序性:在一个集合中,不考虑它的元素之间的顺序,即集合与其元素的排列

2.集合相等:构成两个集合的元素完全一样

3.元素与集合的关系;

(1)如果a 是集合A 的元素,就说a 属于A ,记作a ∈A

(2)如果a 不是集合A 的元素,就说a 不属于A ,记作a ?A

非负整数集(或自然数集),记作N

正整数集,记作N *或N +;

???φ记作不含任何元素的集合空集无限集有限集,:

我们可以用自然语言来描述一个集合,但这将给我们带来很多不便,除此之外还常

用列举法和描述法来表示集合。

(1)列举法:把集合中的元素一一列举出来,写在大括号内。

(2)描述法:把集合中的元素的公共属性描述出来,写在大括号{ }内。

2.书写描述以下条件成立的C++逻辑表达式。
(1)i被j整除 (2)n是小于k的偶数
(3)1≤x<10 (4)x、y其中有一个小于z
(6)坐标点(x, y)落在以(10, 20)为圆心,以35为半径的圆内
(7)三条边a、b和c构成三角形
(8)年份Year能被4整除,但不能被100整除,或者能被400整除

6.输入百分制成绩,并把它转换成五级分制,并显示转换结果。要求用case语句编程。转换公式为:

  1. 编写程序,显示由符号组成的三角形图案。要求程序运行后由用户应答。输出星号三角形的程序运行效果如下:





编写程序,输出小于结果50000正整数的阶乘值。想一想,若用while(1) { }构造循环,循环条件是什么?有什么方法可以结束循环?

2.什么叫作循环控制?归纳比较C++语言中各种循环控制语句的语法、循环条件和循环结束条件的表示形式及执行流程。
循环控制是在特定的条件下,程序重复执行一些特定动作。
语句 语法 执行流程 使用场合

循环条件:表达式值为非0(真)
循环结束条件:表达式值为0(假) 程序中常用于根据条件执行操作而不需关心循环次数的情况。
先判断形式循环,条件不成立时不进入循环体。

循环条件:表达式值为非0(真)
循环结束条件:表达式值为0(假) 程序中常用于根据条件执行操作而不需关心循环次数。
后判断形式循环,至少执行1次循环体。
一般情况,while语句和do while语句可以互换使用。

(1)表达式1称为初始化表达式,不是循环体执行部分。
(2)表达式3称为后置表达式,作为循环体的最后一个执行表达式。
(3)循环条件:表达式2值为非0(真)
循环结束条件:表达式2值为0(假)
for语句称为步长循环语句,通常用于确定循环次数的情况。
由于语句的3个表达式均可以缺省,也可以用于条件循环,即循环次数不确定的情况。

3.根据一个实际问题,用不同的循环语句编程,分析其优缺点。

4.用if语句和goto语句组织循环,改写第3题的程序,并分析在什么情况下可以适当使用goto语句。
在不破坏程序基本流程控制的情况下,可以适当使用goto语句实现从语句结构内部向外的必要跳转,即按特定条件结束结构语句块的执行。

9.编写一个程序,它能够读入一个正方形的边长(1~20),然后打印一个由星号和空格组成的空心正方形。例如,程序读入边长是5,则输出的空心正方形为:



1.函数的作用是什么?如何定义函数?什么叫函数原型?
(1)任务划分,把一个复杂任务划分为若干小任务,便于分工处理和验证程序正确性;(2)软件重用,把一些功能相同或相近的程序段,独立编写成函数,让应用程序随时调用,而不需要编写雷同的代码。
类型 函数名 ( [ 形式参数表 ] )
函数原型是函数声明,告诉编译器函数的接口信息:函数名、返回数据类型、接收的参数个数、参数类型和参数顺序,编译器根据函数原型检查函数调用的正确性。

4.C++函数通过什么方式传递返回值?当一个函数返回指针类型时,对返回表达式有什么要求?若返回引用类型时,是否可以返回一个算术表达式?为什么?
C++首先计算表达式的值,然后把该值赋给函数返回类型的匿名对象,通过这个对象,把数值带回调用点,继续执行后续代码。
当函数返回指针类型时,返回的地址值所指对象不能是局部变量。因为局部变量在函数运行结束后会被销毁,返回这个指针是毫无意义的。
返回引用的对象不能是局部变量,也不能返回表达式。算术表达式的值被储存在匿名空间中,函数运行结束后会被销毁,返回这个变量的引用也是无意义的。

5.变量的生存期和变量作用域有什么区别?请举例说明。
变量的生存期是指程序运行后,变量占有内存的时间;变量作用域指的是指变量声明之后,在程序正文中有效的那部分区域。
该函数中n被定义为static变量,生存期是整个程序运行时期;但作用域只在count函数中。

6.静态局部变量有什么特点?编写一个应用程序,说明静态局部变量的作用。
静态局部变量的生存期是全程的,作用域是局部的。程序开始执行时就分配和初始化存储空间(默认初始化值为0)。定义静态局部变量的函数退出时,系统保持其存储空间和数值。再次调用这个函数时,static变量还是上次退出函数时的值。直至整个程序运行结束,系统才收回存储空间。
以下程序在函数callfun中定义了静态变量n,记录的函数本身被调用的次数。

4.用线性同余法生成随机数序列的公式为:
序列中的每个数rk都可以由它的前一个数rk1计算出来。例如,如果有:
则可以产生65 536个各不相同的整型随机数。设计一个函数作为随机数生成器,生成1位或2位的随 机数。
利用这个随机数生成器,编写一个小学生学习四则运算的练习程序,要求:
① 可以进行难度选择,一级难度只用1位数,二级难度用2位数;
② 可以选择运算类型,包括加、减、乘、除等;

5.已知勒让德多项式为:

1.数组说明语句要向编译器提供什么信息?请写出一维数组、二维数组说明语句的形式。
数组说明语句要向编译器提供数组名(标识符),数组元素的类型、数组维数、数组长度(元素的个数)等信息。
一维数组说明语句为: 类型 数组名[表达式]
二维数组说明语句为: 类型 数组名[表达式1] [表达式2]

2.数组名、数组元素的区别是什么?归纳一维数组元素地址、元素值不同的表示形式。若有说明:
请使用aa或pa,写出三个以上与aa[2]等价的表达式。
数组名是一个标识符,执行代码中代表数组的地址,即指向数组起始位置的指针;而数组元素是下标变量,性质相当于普通变量。
对一维数组aa第i个元素的值可以表示为: a[i] *(a+i);
与aa[2]等价的表达式:

(1)在一个二维数组中形成以下形式的n阶矩阵:

8.设某城市三个百货公司某个季度销售电视机的情况和价格如下所示。编写程序,将表数据用数组存放,求各百货公司的电视机营业额。

1.判断一个整数n的奇偶性,可以利用位运算吗?请你试一试。
可以。一个整数当最低位为1时,它是奇数,否则为偶数。以下函数返回对参数k的奇偶判断。

3.分析以下说明结构的语句:
error和ok分别属于什么数据类型?有什么存储要求?error出错的原因是什么?
error是Node结构类型数据成员,错误。原因是结构定义的数据成员若为本身的结构类型,是一种无穷递归。ok是指向Node类型的指针,定义正确,占4字节。

5.集合的元素通常是字符。设计程序,用无符号整数表示ASCII码字符集合,用位运算实现各种基本集合运算。
ASCII码是0~127的整数,可以用长度为4的无符号整型数组表示集合,如教材例5-6所示。区别是,在输入集合元素时,需要把字符转换成整型数据,在输出操作中,把整型集合元素转换成字符型数据。

12.用带头结点的有序单向链表可以存放集合,如图5.16所示。头结点不存放集合元素,仅为操作方便而设置。使用这种数据结构,设计集合的输入、输出和各种基本运算的函数。

图5.16 带头结点的有序单向链表

1.若class B中定义了一个class A的类成员A a,则关于类成员的正确描述是( )。
(A)在类B的成员函数中可以访问A类的私有数据成员
(B)在类B的成员函数中可以访问A类的保护数据成员
(C)类B的构造函数可以调用类A的构造函数进行数据成员初始化
(D)类A的构造函数可以调用类B的构造函数进行数据成员初始化
2.下列关于类的包含描述正确的是( )。
(A)可以使用赋值语句对对象成员进行初始化
(B)可以使用“参数初始式”调用成员类的构造函数初始化对象成员
(C)被包含类可以访问包含类的成员
(D)首先执行自身构造函数,再调用成员类的构造函数

3.C++提供了系统版本的构造函数,为什么还需要用户自定义构造函数?编写一个验证程序,说明自定义构造函数的必要性。
类的默认构造函数可以建立基本类型数据成员的存储空间。基于以下两个原因,需要用户定义构造函数:
(1)对数据成员的值做指定初始化;
(2)类的数据是由指针管理的堆。

4.试从定义方式、访问方式、存储性质和作用域4个方面来分析类的一般数据成员和静态数据成员的区别,并编写一个简单程序验证它。
定义方式 访问方式 存储性质 作用域
静态数据成员 类中声明,类外定义 对象.数据成员
类::数据成员 全局数据

5.试从定义方式、调用方式两个方面来分析常成员函数、静态成员函数和友元函数的区别。考察例6-16,若class Goods的指针域:
被声明为私有(private)成员,程序会出现什么错误?做什么最小修改能使程序正确运行?
常成员函数 函数原型以const做后缀
this指针被约束为指向常量的常指针 与一般成员函数调用形式相同
静态成员函数 以static做函数原型前缀
没有this指针 通过类或对象调用
友员函数 以friend做函数原型前缀
没有this指针 通过参数访问对象
可以访问对象的不同属性的成员
在例6-16中,若把next声明为私有数据成员,只须把有关指针操作的函数定义为友员函数就可以了:

4.定义一个表示点的结构类型Point和一个由直线方程y = ax + b确定的直线类Line。结构类型Point有两个成员x和y,分别表示点的横坐标和纵坐标。Line类有两个数据成员a和b,分别表示直线方程中的系数。Line类有一个成员函数print用于显示直线方程。友元函数setPoint(Line &l1,Line

5.用类成员结构修改第4题的程序,使其实现相同的功能。定义Point类和Line类,表示点和线;定义setPoint类,包含两个Line类成员和一个表示直线交点的Point成员,并定义类中求直线交点的成员函数。编写每个类相应的成员函数和测试用的主函数。
1.在下列运算符中,不能重载的是( )。
2.在下列关于运算符重载的描述中,( )是正确的。
(A)可以改变参与运算的操作数个数 (B)可以改变运算符原来的优先级
(C)可以改变运算符原来的结合性 (D)不能改变原运算符的语义
3.运算符函数是一种特殊的( )或友元函数。
(A)构造函数 (B)析构函数 (C)成员函数 (D)重载函数
4.设op表示要重载的运算符,那么重载运算符的函数名是( )。
5.用于类运算的运算符通常都要重载。但有两个运算符系统提供默认重载版本,它们是( )。

1.在下列函数中,不能重载运算符的函数是( )。
(A)成员函数 (B)构造函数 (C)普通函数 (D)友元函数
2.在下列运算符中,要求用成员函数重载的运算符是( )。
3.在下列运算符中,要求用友元函数重载的运算符是( )。
4.如果希望运算符的操作数(尤其是第一个操作数)有隐式转换,则重载运算符时必须用( )。
(A)构造函数 (B)析构函数 (C)成员函数 (D)友元函数
5.当一元运算符的操作数,或者二元运算符的左操作数是该类的一个对象时,重载运算符函数一般定义为( )。
(A)构造函数 (B)析构函数 (C)成员函数 (D)友元函数

1.类型转换函数只能定义为一个类的( )。
(A)构造函数 (B)析构函数 (C)成员函数 (D)友元函数
2.具有一个非默认参数的构造函数一般用于实现从( )的转换。
(A)该类类型到参数类型 (B)参数类型到该类类型
(C)参数类型到基本类型 (D)类类型到基本类型
3.假设ClassX是类类型标识符,Type为类型标识符,可以是基本类型或类类型,Type_Value为Type类型的表达式,那么,类型转换函数的形式为( )。
4.在下列关于类型转换的描述中,错误的是( )。
(A)任何形式的构造函数都可以实现数据类型转换。
(B)带非默认参数的构造函数可以把基本类型数据转换成类类型对象。
(C)类型转换函数可以把类类型对象转换为其他指定类型对象。
(D)类型转换函数只能定义为一个类的成员函数,不能定义为类的友元函数。
5.C++中利用构造函数进行类类型转换时的构造函数形式为( )。

2.类类型对象之间、类类型和基本类型对象之间用什么函数进行类型转换?归纳进行类型转换的构造函数和类型转换函数的定义形式、调用形式和调用时机。
构造函数可以把基本类型、类类型数据转换成类类型数据;类类型转换函数可以在类类型和基本数据类型之间做数据转换。
定义形式 调用形式 调用时机
自动类型转换时隐式调用 需要做数据类型转换时

4.定义一个类nauticalmile_kilometer,它包含两个数据成员kilometer(千米)和meter(米);还包含一个构造函数对数据成员进行初始化;成员函数print,用于输出数据成员kilometer和meter的值;类型转换函数operator

5.定义一个集合类setColour,要求元素为枚举类型值。例如,
集合类实现交、并、差、属于、蕴含、输入、输出等各种基本运算。设计main函数测试setColour类的功能。
枚举类型数据用序值参与运算。定义枚举集合关键是对输入/输出操作进行显示转换。

1.当一个派生类公有继承一个基类时,基类中的所有公有成员成为派生类的( )。
2.当一个派生类私有继承一个基类时,基类中的所有公有成员和保护成员成为派生类的( )。
3.当一个派生类保护继承一个基类时,基类中的所有公有成员和保护成员成为派生类的( )。
4.不论派生类以何种方式继承基类,都不能直接使用基类的( )。
5.在C++中,不加说明,则默认的继承方式是( )。
6.某公有派生类的成员函数不能直接访问基类中继承来的某个成员,则该成员一定是基类中的( )。
(A)私有成员 (B)公有成员 (C)保护成员 (D)保护成员或私有成员
7.下列关于类层次中重名成员的描述,错误的是( )。
(A)C++允许派生类的成员与基类成员重名
(B)在派生类中访问重名成员时,屏蔽基类的同名成员
(C)在派生类中不能访问基类的同名成员
(D)如果要在派生类中访问基类的同名成员,可以显式地使用作用域符指定
8.下列关于类层次中静态成员的描述,正确的是( )。
(A)在基类中定义的静态成员,只能由基类的对象访问
(B)在基类中定义的静态成员,在整个类体系中共享
(C)在基类中定义的静态成员,不管派生类以何种方式继承,在类层次中具有相同的访问性质
(D)一旦在基类中定义了静态成员,就不能在派生类中再定义

1.在C++中,可以被派生类继承的函数是( )。
(A)成员函数 (B)构造函数 (C)析构函数 (D)友元函数
2.下列关于派生类对象的初始化,叙述正确的是( )。
(A)是由派生类的构造函数实现的
(B)是由基类的构造函数实现的
(C)是由基类和派生类的构造函数实现的
(D)是系统自动完成的,不需要程序设计者干预
3.在创建派生类对象时,构造函数的执行顺序是( )。
(A)对象成员构造函数—基类构造函数—派生类本身的构造函数
(B)派生类本身的构造函数—基类构造函数—对象成员构造函数
(C)基类构造函数—派生类本身的构造函数—对象成员构造函数
(D)基类构造函数—对象成员构造函数—派生类本身的构造函数
4.在具有继承关系的类层次体系中,析构函数执行的顺序是( )。
(A)对象成员析构函数—基类析构函数—派生类本身的析构函数
(B)派生类本身的析构函数—对象成员析构函数—基类析构函数
(C)基类析构函数—派生类本身的析构函数—对象成员析构函数
(D)基类析构函数—对象成员析构函数—派生类本身的析构函数
5.在创建派生类对象时,类层次中构造函数的执行顺序是由( )。
(A)派生类的参数初始式列表的顺序决定的 (B)系统规定的
(C)是由类的书写顺序决定的 (D)是任意的

1.当不同的类具有相同的间接基类时,( )。
(A)各派生类无法按继承路线产生自己的基类版本
(B)为了建立唯一的间接基类版本,应该声明间接基类为虚基类
(C)为了建立唯一的间接基类版本,应该声明派生类虚继承基类
(D)一旦声明虚继承,基类的性质就改变了,不能再定义新的派生类
2.下列关于多继承的描述,错误的是( )。
(A)一个派生类对象可以拥有多个直接或间接基类的成员
(B)在多继承时不同的基类可以有同名成员
(C)对于不同基类的同名成员,派生类对象访问它们时不会出现二义性
(D)对于不同基类的不同名成员,派生类对象访问它们时不会出现二义性
3.下面关于基类和派生类的描述,正确的是( )。
(A)一个类可以被多次说明为一个派生类的直接基类,可以不止一次地成为间接基类
(B)一个类不能被多次说明为一个派生类的直接基类,可以不止一次地成为间接基类
(C)一个类不能被多次说明为一个派生类的直接基类,且只能成为一次间接基类
(D)一个类可以被多次说明为一个派生类的直接基类,但只能成为一次间接基类
4.下列关于虚继承的说明形式的描述,正确的是( )。
(A)在派生类类名前添加关键字virtual (B)在基类类名前添加关键字virtual
(C)在基类类名后添加关键字virtual
(D)在派生类类名后,类继承的关键字之前添加关键字virtual
5.设置虚基类的目的是( )。
(A)简化程序 (B)消除二义性 (C)提高运行效率 (D)减少目标代码

1.函数和类这两种程序模块都可以实现软件重用,它们之间有什么区别?
函数是基于参数集的功能抽象模块,以调用方式实现软件重用,函数之间没有逻辑关系。
类是数据属性与操作的封装,以继承方式实现软件重用,类之间构成有向无回图的类格。

2.按照类成员的访问特性、类层次的继承特点,制作一张表格,总结各种类成员在基类、派生类中的可见性和作用域。

public 在派生类中访问特性不变。派生类和类外均可见,有作用域。 在派生类中访问特性不变。类体系中可见。 基类私有成员,仅在基类中可见。
protected 成为派生类保护段成员。在整个类体系中可见。
private 成为派生类私有成员。仅在派生类和基类中可见。
派生类不论以何种方式继承基类,基类所有成员在整个类体系有作用域。

6.在第6章的例6-21中,定义Student类包含了Date类成员。可以用继承方式把Student类定义为Date类的派生类吗?如何改写程序?请你试一试。
可以用继承方式改写。程序略。

7.“虚基类”是通过什么方式定义的?如果类A有派生类B、C,类A是类B虚基类,那么它也一定是类C的虚基类吗?为什么?
虚基类是在声明派生类时,指定继承方式时声明的,声明虚基类的一般形式为:
若类A是类B和类C的虚基类,但不一定是类D的虚基类,原因在于“虚基类”中的“虚”不是基类本身的性质。而是派生类在继承过程中的特性。关键字virtual只是说明该派生类把基类当作虚基类继承,不能说明基类其他派生类继承基类的方式

8.在具有虚继承的类体系中,建立派生类对象时,以什么顺序调用构造函数?请用简单程序验证你的分析。
在具有虚继承的类体系中,建立派生类对象时先调用间接基类构造函数,再按照派生类定义时各个直接基类继承的顺序调用直接基类的构造函数,最后再对派生类对象自身构造函数。
另外,C++为了保证虚基类构造函数只被建立对象的类执行一次,规定在创建对象的派生类构造函数中只调用虚基类的构造函数和进行(执行)自身的初始化。参数表中的其他调用被忽略,即直接基类的构造函数只调用系统自带的版本,或调用自定义版本但不对虚基类数据成员初始化。

2.试写出你所能想到的所有形状(包括二维的和三维的),生成一个形状层次类体系。生成的类体系以Shape作为基类,并由此派生出TwoDimShape类和ThreeDimShape类。它们的派生类是不同的形状类。定义类体系中的每个类,并用main函数进行测试。

3.为第7章综合练习的程序设计第1题和第2题中的Integer类和Real类定义一个派生类IntReal:
使其可以进行+、-、*、/、= 的左、右操作数类型不同的相容运算,并符合原有运算类型转换的语义规则。

6.使用第5题定义的Vector类,定义它的派生类Matrix,实现矩阵的基本算术运算。

7.用包含方式改写第6题的Matrix类,使其实现相同的功能。

8.设计快捷店会员的简单管理程序。基本要求如下:
(1)定义人民币RMB类,实现人民币的基本运算和显示。
(2)定义会员member类,表示会员的基本信息,包括:编号(按建立会员的顺序自动生成),姓名,密码,电话。提供输入、输出信息等功能。
(3)由RMB类和member类共同派生一个会员卡memberCar类,提供新建会员、充值、消费和查询余额等功能。
(4)main函数定义一个memberCar类数组或链表,保存会员卡,模拟一个快捷店的会员卡管理功能,主要包括:
③ 已有会员消费(凭密码,不能透支);
④ 输出快捷店当前会员数,营业额(收、支情况)。

1.静态联编又叫作( )。
(A)延迟联编 (B)早期联编 (C)晚期联编 (D)以上三者都行
2.基类的指针与派生类指针,可以分别指向基类对象或派生类对象而形成4种情形。在这4种情形中,需要进行强制类型转换的是( )。
(A)基类指针指向基类对象 (B)基类指针指向派生类对象
(C)派生类指针指向基类对象 (D)派生类指针指向派生类对象
3.当基类指针指向派生类对象时,( )。
(B)只能调用基类自己定义的成员函数
(C)可以调用派生类的全部成员函数
(D)以上说法全部错误
4.当基类指针指向派生类对象时,利用基类指针调用派生类中与基类同名但被派生类重写后的成员函数时,调用的是( )。
(A)基类的成员函数 (B)派生类的成员函数
(C)不确定 (D)先调用基类的,再调用派生类的
5. 当派生类指针指向基类对象时( )。
(A)可以直接调用基类的成员函数
(B)可以调用派生类对象的成员函数
(C)必须强制将派生类指针转换成基类指针才能调用基类的成员函数

  1. 在C++中,要实现动态联编,必须使用( )调用虚函数。
    (A)基类指针 (B)对象名 (C)派生类指针 (D)类名
  2. 下列函数中,不能说明为虚函数的是( )。
    (A)析构函数 (B)构造函数 (C)公有成员函数 (D)私有成员函数
  3. 在派生类中,重载一个虚函数时,要求函数名、参数的个数、参数的类型、参数的顺序和函数的返回值( )。
    (A)部分相同 (B)相容 (C)不同 (D)相同
  4. 下面关于构造函数和析构函数的描述,错误的是( )。
    (A)析构函数中调用虚函数采用静态联编
    (B)对虚析构函数的调用可以采用动态联编
    (C)当基类的析构函数是虚函数时,其派生类的析构函数也一定是虚函数
    (D)构造函数可以声明为虚函数
  5. 在C++中,根据( )识别类层次中不同类定义的虚函数版本。
    (A)参数个数 (B)参数类型 (C)函数名 (D)this指针类型
  6. 虚析构函数的作用是( )。
    (A)虚基类必须定义虚析构函数 (B)类对象作用域结束时释放资源
    (C)delete动态对象时释放资源 (D)无意义
  1. 若一个类中含有纯虚函数,则该类称为( )。
    (A)基类 (B)纯基类 (C)抽象类 (D)派生类
  2. 下面描述中,正确的是( )。
    (A)虚函数是没有实现的函数 (B)纯虚函数是返回值等于0的函数
    (C)抽象类是只有纯虚函数的类 (D)抽象类指针可以指向不同的派生类(A)用数组组织类对象 (B)用链表组织类对象
    (C)用抽象类指针指向派生类对象 (D)用抽象类指针构造派生类对象链表

1.在C++中,使用类体系依靠什么机制实现程序运行时的多态?
在C++中,基类指针可以指向派生类对象,以及基类中拥有虚函数,是支持多态性的前提。程序通过用同一个基类指针访问不同派生类的虚函数重载版本实现程序运行时的多态。C++的虚特性负责自动地在程序运行时把基类指针的关联类型转换成当前指向对象的派生类类型。
另外,抽象类机制提供了软件抽象和可扩展性的手段,实现运行时的多态性。

2.如果一个类的虚函数被声明为私有成员函数,会有语法错误吗?当它作为基类时,可以在应用类体系时实现动态联编吗?请验证一下。
没有语法错误。但在应用类体系时无法实现动态编联和多态。因为私有成员函数只在类内可见,在类外无法调用,无法在类外通过基类指针实现多态。

3.虚函数和纯虚函数的区别是什么?
虚函数定义时冠以关键字virtual,本身有实现代码,作用是引导基类指针根据指向对象调用类体系中不同重载版本函数。
纯虚函数是指在说明时代码“为0”的虚函数,即纯虚函数本身并没有实现代码,必须通过它的派生类定义实现版本。

4.一个非抽象类的派生类是否可以为抽象类?利用例9-11进行验证,从Hex_type类派生一个Hex_format类,其中包含一个纯虚函数Show_format,然后定义Hex_format的派生类定义实现Show_format。
一个非抽象类的派生类可以为抽象类,即在派生类中定义了纯虚函数。

3.使用第2题中定义的教师类体系,编写程序,输入某月各种职称教师的工资信息,建立异质链表,输出每位教师的工资条,统计当月的总工资、平均工资、最高工资和最低工资。

4.改写第8章综合练习第2题的程序,把Shape类定义为抽象类,提供共同操作界面的纯虚函数。TwoDimShape类和ThreeDimShape类仍然是抽象类,只有第3层具体类才提供全部函数的实现。在测试函数中,使用基类指针实现不同派生类对象的操作。

1.关于类模板,描述错误的是( )。
(A)一个普通基类不能派生类模板
(B)类模板可以从普通类派生,也可以从类模板派生
(C)根据建立对象时的实际数据类型,编译器把类模板实例化为模板类
(D)函数的类模板参数需生成模板类并通过构造函数实例化
2.建立类模板对象的实例化过程为( )。
(A)基类→派生类 (B)构造函数→对象
(C)模板类→对象 (D)模板类→模板函数
3.在一个类层次结构中,( )。
(A)若基类是类模板,派生类必定是类模板。
(B)若基类是普通类,派生类也只能是普通类。
(C)一个普通类的派生类不能增加类属参数。
(D)一个派生类可以对作为基类的类模板提供实例化的类型参数。
4.若一个类模板定义了静态数据成员,正确的叙述的是( )。
(A)每一个实例化的模板类都有自己的静态数据成员副本
(B)类模板的静态数据成员在声明类模板时定义和初始化
(C)一个类模板实例化的不同模板类的全部对象共享一个静态数据成员
(D)一个类模板实例化后的每个对象都有自己的静态数据成员副本
5. 关于类模板与友元叙述错误的是( )。
(A)一般函数可以声明为类模板的友元
(B)函数模板可以声明为类模板的友元
(C)一个模板类可以声明为另一个类模板的友元
(D)一个模板类的友元只能是模板
6. 若有以下类模板声明,则正确的说明语句是( )。

1.抽象类和类模板都是提供抽象的机制,请分析它们的区别和应用场合。
抽象类至少包含一个纯虚函数,纯虚函数抽象了类体系中一些类似操作的公共界面,它不依赖于数据,也没有操作定义。派生类必须定义实现版本。抽象类用于程序开发时对功能的统一策划,利用程序运行的多态性自动匹配实行不同版本的函数。
类模板抽象了数据类型,称为类属参数。成员函数描述了类型不同,逻辑操作相同的功能集。编译器用建立对象的数据类型参数实例化为模板类,生成可运行的实体。类模板用于抽象数据对象类型不同,逻辑操作完全相同类定义。这种数据类型的推导必须在语言功能的范畴之内的。
2.类属参数可以实现类型转换吗?如果不行,应该如何处理?
类属参数不可以实现类型转换。为了解决参数隐式类型转换的问题,可以用类型参数把函数模板重载为非模板函数。

3.类模板能够声明什么形式的友元?当类模板的友元是函数模板时,它们可以定义不同形式的类属参数吗?请编写一个验证程序试一试。
类模板可以声明的友员形式有:普通函数、函数模板、普通类成员函数、类模板成员函数以及普通类、类模板。
当类模板的友员是函数模板时,它们可以定义不同形式的类属参数。

4.类模板的静态数据成员可以是抽象类型吗?它们的存储空间是什么时候建立的?请用验证程序试一试。
类模板的静态数据成员可以是抽象类型。它们的存储空间在生成具体模板类的时候建立,即每生成一个模板类同时建立静态储存空间并做一次文件范围的初始化。

运算;类模板T_Vector,实现向量运算;类模板T_Matrix,实现矩阵运算。请分析使用类模板建立T_Counter、T_Vector、T_Matrix对象和使用类继承体系建立IntReal、Vector、Matrix对象(见第8章综合练习的程序设计第3、4、5题)的语法区别和运算功能区别。

3.学习MSDN Library中Visual C++的STL,应用容器和算法,实现一个简单的人员信息管理系统。

1.在下列流类中,可以用于处理输入/输出的是( )。
2.在下列选项中,( )是istream类的对象。
3.在下列选项中,不可以作为输出流对象的是( )。
(A)文件 (B)内存 (C)键盘 (D)显示器
4.在下列选项中,用于处理字符串流的是( )。
5.能够从输入流中提取指定长度的字节序列的函数是( )。
6.能够把指定长度的字节序列插入到输出流中的函数是( )。
7.getline函数的功能是从输入流中读取( )。
(A)一个字符 (B)当前字符 (C)一行字符 (D)指定若干个字节
8.要进行文件的输出,除了包含头文件iostream外,还要包含头文件( )。
9.用标准输入流对象cin与提取操作符>>连用进行输入时,将空格与回车当作分隔符,使用( )成员函数进行输入时可以指定输入分隔符。
10.在ios类中,状态字用于记录流错误状态,其每位对应一种流的错误状态,其中( )表示流数据已遭到损坏。

1.使用串流类需要包含( )头文件。
2.串流在提取数据时,对字符串按( )解释。
(A)整型数据 (B)浮点型数据 (C)变量类型 (D)ASC码
3.串流在插入数据时,把各种类型数据转换成( )。
(A)二进制码 (B)十进制码 (C)格式化ASC码 (D)计算结果

1.在Visual C++中,流类库的作用是什么?有人说,cin是键盘,cout是显示器,这种说法正确吗?为什么?
在Visual C++中,流类库是一个程序包,作用是实现对象之间的数据交互。“cin是键盘,cout是显示器”的说法不正确。cin和cout分别是istream和ostream的预定义对象,默认连接标准设备键盘、显示器,解释从键盘接受的信息,传送到内存;把内存的信息解释传送到显示器。所以称为标准流对象。程序可以对cin、cout重定向,连接到用户指定的设备,例如指定的磁盘文件。

2.什么叫文件?C++读/写文件需要通过什么对象?有些什么基本操作步骤?
任何一个应用程序运行,都要利用内存储器存放数据。这些数据在程序运行结束之后就会消失。为了永久的保存大量数据,计算机用外存储器(如磁盘和磁带)保存数据。各种计算机应用系统通常把一些相关信息组织起来保存在外存储器中,并用一个名字(称为文件名)加以标识,称为文件。
C++读/写文件需要用到文件流对象。
文件操作的三个主要步骤是:打开文件、读/写文件、关闭文件流。
打开文件包括建立文件流对象,与外部文件关联,指定文件的打开方式。
读/写文件是按文件信息规格、数据形式与内存交互数据的过程。
关闭文件包括把缓冲区数据完整地写入文件,添加文件结束表示符,切断流对象和外部文件的连接。

3.一个已经建立的文本文件可以用二进制代码方式打开操作吗?一个二进制数据文件可以用文本方式打开吗?为什么?写一个程序试一试。
一个已经建立的文本文件可以用二进制方式打开操作。但必须以字符类型数据读取数据然后转换成需要的类型数据才有意义。通常一个二进制文件用文本方式打开是没有意义的,除非这个二进制文件全部是用字符类型数据建立的。因为文本文件是以可读形式ASC码存放数据的,二进制文件直接用计算机表示数据的二进制形式存放数据,它们之间解释方式不同。

1.对一个应用是否一定要设计异常处理程序?异常处理的作用是什么?
一个应用不一定要设计异常处理程序。异常处理以结构化思想把异常检测与异常处理分离,增加了程序的可读性,便于大型软件的开发。

2.什么叫抛出异常?catch可以获取什么异常参数?是根据异常参数的类型还是根据参数的值处理异常?请编写测试程序验证。
C++异常处理通过三个关键字实现:throw、try和catch。被调用函数按指定条件检测到异常条件的存在,用throw一个数值,称为抛出一个异常。这个函数仅仅做了throw,而不去处理错误。在上层调用函数中使用try语句检测函数调用是否引发异常,被检测到的各种异常由catch语句捕获并作相应的处理。catch只是根据异常参数的类型(不管具体数值)处理异常。

3.什么是不唤醒机制?这种机制有什么好处?请举例说明。
不唤醒机制是指抛出异常后,调用链上的所有模块都终止执行,不返回异常抛出点。这种机制的好处是把函数的正常功能设计和异常处理设计分离,便于结构化处理。

2.程序中,典型的异常有:内存不足以满足new的请求、数组下标越界、运算溢出、除数为0或无效函数参数等。简单描述程序应该如何用异常处理的方法处理这些情况。

3.把第12章12.2.4节中的代码补充成完整的测试程序并运行。

我要回帖

更多关于 集合的两种表示方法 的文章

 

随机推荐