1.下面关于继承说法不正确的是( )
A.继承可以使用现有类的所有功能,并在无需重新编写原来类的情况下对这些功能进行扩展
B.继承体系中子类必须要体现出与基类的不同
C.子类对象一定比基类对象大
D.继承呈现了面相对象程序设计的层次结构,体现了有简单到复杂的认知过程
答案解析
A.这是继承的功能,也是代码复用的体现
B.继承除了吸收基类成员之外,一般还需要扩充自己的数据成员,跟基类有所不一样
C.不一定,有可能子类只是改写父类的方法而已,并没有增加其自身的数据成员,则大小一样,故错误
D.继承体现了一定的层次结构和认知过程
2.关于继承说法正确的是( )
A.所有的类都可以被继承
B.Car(汽车)类和Tire(轮胎)类可以使用继承方式体现
C.继承是实现代码复用的唯一手段
D.狗是一种动物,可以体现出继承的思想
答案解析
A.final说明的类不能被继承
B.应该使用组合,因为Tire类跟Car类属于Has-a的关系
C.模板也是代码复用的重要手段
D.狗是动物的一种,属于is-a关系,是继承的体现
3.下面关于访问权限与继承权限说法不正确的是( )
A.访问权限和继承权限是不同的概念
B.访问权限和继承权限关键字上是一样的,但是出现位置不一样
C.如果是protected继承方式,基类public的成员变量能通过基类对象在类外直接访问
D.基类私有的成员变量在子类中都不能直接访问,因为没有被子类继承了
答案解析
A.两个权限控制的东西不一样
B.访问权限在类内部,继承权限在类外
C.只要是public成员对象都可以直接访问
D.基类私有成员不能直接访问不是没有被继承,而是权限问题
4.关于同名隐藏的说法正确的是( )
A.同一个类中,不能存在相同名称的成员函数
B.在基类和子类中,可以存在相同名称但参数列表不同的函数,他们形成重载
C.在基类和子类中,不能存在函数原型完全相同的函数,因为编译时会报错
D.成员函数可以同名,只要参数类型不同即可,成员变量不能同名,即使类型不同
答案解析
A.可以存在,如函数重载
B.基类与子类函数名字相同,参数不同,形成的是隐藏
C.可以共存
D.成员函数在同一个类里面同名,此时构成了重载,但变量一定不能同名,故正确
5.关于同名隐藏的说法正确的是( )
下面代码输出结果:( )
class A
{
public:
void f(){ cout<<“A::f()”<<endl; }
int a;
};
class B : public A
{
public:
void f(int a){cout<<“B::f()”<<endl;}
int a;
};
int main()
{
B b;
b.f();
return 0;
}
A.打印A::f()
B.打印B::f()
C.不能通过编译,因为基类和派生类中a的类型以及名称完全相同
D.以上说法都不对
答案解析
A.错误
B.错误
C.不能通过编译是正确的,不过原因不是因为成员变量a的问题,而是子类同名隐藏了父类方法的原因
D.很显然以上说法都不对
数据结构
数据结构是计算机科学中的一个核心概念,它涉及到计算机中数据的存储、组织和管理方式。以下是关于数据结构的详细解释:
- 定义:
- 数据结构是计算机存储、组织数据的方式。具体地说,数据结构是相互之间存在一种或多种特定关系的数据元素的集合,它研究的是数据的逻辑结构和数据的物理结构以及它们之间的相互关系。
- 要素:
- 数据结构的两个基本要素是:数据元素的集合和关系的集合。数据元素是数据结构的基本单位,而关系则定义了这些元素如何相互关联。
- 分类:
- 数据结构可以按数据元素之间关系的不同进行分类,主要分为四类:
- 集合结构:数据元素属于同一个集合。
- 线性结构:数据元素之间存在着一对一的关系。常见的有链表、队列、栈等。
- 树形结构:数据元素之间存在着一对多的关系。常见的有二叉树、二叉查找树、平衡二叉查找树等。
- 图形结构:数据元素之间存在着多对多的关系。
- 按照存储方式的不同,数据结构可以分为顺序存储结构和链式存储结构:
- 顺序存储结构:数据元素在存储器中是连续存储的,可以用相对位转走来表示数据元素之间的逻辑结构,如顺序表、队列、栈等。
- 链式存储结构:每个数据元素里设置了一个指针用来指向另一个元素的存储地址,以此来表示数据元素之间的逻辑结构。
- 逻辑关系与存储关系:
- 数据的逻辑结构指的是数据元素之间的逻辑关系,而数据的存储结构则指的是数据元素在计算机中的表示和存储方式。这两者密切相关,是设计数据结构时需要考虑的重要因素。
- 应用:
- 数据结构在编程和软件开发中扮演着至关重要的角色。通过选择合适的数据结构,可以提高程序的运行效率、减少存储空间的使用,并使得代码更加清晰、易于维护。数据结构的选择和设计是程序设计的基础和关键。
- 常用数据结构:
- 在实际编程中,常用的数据结构包括数组、链表、栈、队列、树和图等。这些数据结构各有特点,适用于不同的应用场景。例如,数组适用于需要快速访问任意元素的情况,链表适用于需要动态调整元素数量的情况,树和图则适用于表示具有层次或网状关系的数据。
- 设计原则:
- 在设计数据结构时,需要考虑数据元素的特性、操作的需求以及存储空间的限制等因素。设计良好的数据结构应该具有高效性、稳定性和可扩展性等特点,能够满足实际应用的需求。
总之,数据结构是计算机科学中不可或缺的一部分,它涉及到计算机中数据的存储、组织和管理方式。通过学习和掌握数据结构的相关知识,可以更好地理解和应用计算机技术解决实际问题。
数组
数组(Array)是一种重要的数据结构,主要用于存储具有相同数据类型的多个元素的集合。下面我将从多个方面对数组进行详细介绍:
定义与性质
定义:数组是有序的元素序列,用于存储多个相同类型的数据。这些有序排列的同类数据元素的集合称为数组。
性质:
- 定长性:当数组被声明后,空间所能存放的元素个数就是确定的。虽然可以对数组进行扩容操作,但原始数组的大小在声明时就已经确定。
- 连续性:数组在存放时必须在该空间的最前面连续存放,这意味着数组中的元素在内存中是连续排列的。
- 边界检查:数组具有边界检查功能,当索引不在数组范围内时会抛出异常(如C#中的IndexOutOfRangeException或Java中的ArrayIndexOutOfBoundsException)。
分类
- 一维数组:由一组具有相同数据类型的数据按照一定顺序排列而成的线性表。
- 二维数组:由若干个一维数组组成的表格状数据结构,可以看作是一个行列都固定的矩阵。
- 稀疏数组:当数组中大部分元素为0或同一值时,采用压缩存储方式,只记录不同值的元素和其位置,以节省存储空间和提高运算效率。
- 动态数组:在插入或删除元素时可以自动改变大小的一维数组,具有灵活性和高效性。
- 布尔数组:由若干个布尔值组成的数组,可以用来表示某些问题的真值表或状态表。
应用与初始化
- 一维数组:通常用于存储一组具有相同属性的数据。例如,在C语言中可以使用int a[10];声明一个可以存储10个整数的数组。初始化时,可以逐个赋值,也可以一次性赋值(如int a[10] = {0, 1, 2, …};)。
- 二维数组:常用于表示表格或矩阵形式的数据。在C语言中,可以使用int a[3][4];声明一个3行4列的二维数组。初始化时,可以分行赋值(如int a[3][4] = {{1, 2, 3, 4}, {5, 6, 7, 8}, {9, 10, 11, 12}};)。
注意事项
- 在使用数组时,要注意不要越界访问,即不要使用超出数组范围的索引。这可能会导致程序崩溃或产生不可预料的结果。
- 在声明数组时,要根据实际需要选择合适的大小。过大的数组可能会浪费内存空间,而过小的数组则可能无法满足存储需求。
- 在某些编程语言中(如C++和Java),数组的大小可以是动态的,即可以在运行时根据需要调整数组的大小。但在某些其他编程语言中(如C),数组的大小在声明时就必须确定,并且之后不能更改。
总结
数组是一种非常重要的数据结构,在编程中有着广泛的应用。通过合理地使用数组,可以高效地处理大量具有相同类型的数据,提高程序的运行效率。同时,也要注意在使用数组时遵守相关的规则和注意事项,以确保程序的正确性和稳定性。
链表
链表是一种物理存储单元上非连续、非顺序的存储结构,其特点是通过链表中的指针链接次序来实现数据元素的逻辑顺序。以下是关于链表的详细介绍:
链表的基本概念
链表由一系列结点(链表中每一个元素称为结点)组成,这些结点可以在运行时动态生成。
每个结点包括两个部分:一个是存储数据元素的数据域,另一个是存储下一个结点地址的指针域。
链表的特点
动态分配:链表结构可以充分利用计算机内存空间,实现灵活的内存动态管理。结点可以在需要时动态生成,不需要预先知道数据的大小。
插入和删除效率高:由于链表在物理存储上不是连续的,因此在进行插入和删除操作时,不需要移动大量元素,从而达到较高的效率。特别是在链表头部进行插入和删除操作时,时间复杂度可以达到O(1)。
顺序访问:链表只能从头结点开始,顺序访问每个结点,直到找到目标数据或遍历完整个链表。因此,访问链表中的特定元素或查找某个元素可能需要O(n)的时间复杂度。
空间开销:由于每个结点都需要存储指向下一个结点的指针,因此链表的空间开销相对较大。
链表的类型
链表有多种类型,包括单向链表、双向链表和循环链表等。其中,单向链表是最简单的形式,每个结点只有一个指向下一个结点的指针;双向链表则每个结点有两个指针,分别指向前一个结点和后一个结点;循环链表则是尾结点的指针指向头结点,形成一个环状结构。
链表的应用场景
链表在计算机科学中被广泛应用于各种场景,如文件系统的目录结构、网页浏览器的历史记录、电话簿中的联系人列表、音乐播放器的播放列表以及操作系统的进程管理等。这些应用场景都充分利用了链表动态分配、插入和删除效率高的特点。
总结:链表作为一种重要的数据结构,在实际应用中具有广泛的用途。它克服了数组需要预先知道数据大小的缺点,实现了灵活的内存动态管理。然而,链表也失去了数组随机读取的优点,并且在空间开销上相对较大。因此,在选择使用链表还是其他数据结构时,需要根据具体的应用场景和需求进行权衡。