目录
一、定义抽象数据类型
1. 类的基本思想
数据抽象:定义数据成员和函数成员的能力
封装:分离类的实现与接口,保护类的成员不被随意访问的能力
2. 抽象数据类型:封装了实现细节的数据结构
数据抽象
3. 在成员函数内部,可以随意调用该函数的对象的成员,想当于this的隐式引用
但是在类的外部定义成员函数,就必须包含它所属的类名
4. 构造函数:初始化类对象的数据成员,且没有返回类型
当类没有声明任何构造函数时,编译器才会自动地生成默认构造函数
5. 无法使用默认构造函数的几种原因:
(1) 已经定义了其他的构造函数,且没有单独声明一个默认构造函数
(2) 自动合成的默认构造func可能会执行错误的操作
(3) 编译器不能为某些类合成默认的构造函数
二、访问控制和封装
1. 使用访问控制说明符加强类的封装性:
◇ 定义在public之后的成员,在整个程序内可以被访问,public成员定义类的接口
◇ 定义在private之后的成员,可以被类的成员函数访问,被隐藏了
2. struct默认访问权限是public的(都有u),class默认访问权限是private的,其他无区别
3. 封装是什么?有什么用处?
封装是实现与接口的分离。它隐藏了类型的实现细节。(在C++中,封装是通过将实现放在一个类的私有部分来实现的)
封装有两个重要的优点:
◇ 确保用户代码不会无意间破坏封装对象的状态;
◇ 被封装的类的具体实现细节可以随时改变,而无须调整用户级别的代码。
4.
友元friend在什么时候有用?怎么定义请分别举出使用友元的利弊。
类可以允许其他类或者函数访问它的private成员,方法是令其他类或者函数成为它的友元friend函数,必须在类定义内声明
优点:
外部函数可以方便地使用类的成员,而不需要显示地给它们加上类名;
可以方便地访问所有非公有成员;
有时,对类的用户更容易读懂。
缺点:
减少封装和可维护性;
代码冗长,类内的声明,必须要在类外声明该函数/类(最好类外再另外声明不强制要求)
5. 声明重载函数为friend,要每个版本都声明一遍
6. 类的引用和const成员必须初始化
三、类的其他特性
1. 内联函数inline
函数调用是有时间和空间开销的。程序在执行一个函数之前需要将实参、局部变量、返回地址以及若干寄存器都压入栈中,然后才能执行函数体中的代码;函数体中的代码执行完毕后还要清理现场,将之前压入栈中的数据都出栈,才能接着执行函数调用位置以后的代码。
如果函数只有一两条语句,那么大部分的时间都会花费在函数调用机制上,这种时间开销就就不容忽视。
为了消除函数调用的时空开销,即在编译时将函数调用处用函数体替换,类似于C语言中的宏展开。这种在函数调用处直接嵌入函数体的函数称为内联函数(Inline Function),又称内嵌函数或者内置函数。
2. 聚合类:满足
(1)所有成员都是public的 (2)没有定义任何构造函数
(3)没有类内初始值 (4)没有基类和virtual函数
3.
什么是类的静态成员?它有何优点?静态成员与普通成员有何区别?
(1)类的静态static成员,static只能出现在类内。可以是public/private,也可以是常量/引用/指针/类类型。 类的静态成员与类本身直接相关,而不是与类的各个对象保持关联。
(2)每个对象不需要存储公共数据,如果数据被改变,则每个对象都可以使用新值。
(3)静态数据成员可以是不完全类型;可以使用静态成员作为默认实参。