类
- 1、类的概述
- (1)What(什么是类)
- (2)Why(类的作用)
- (3)类的初始化
- (4)类的组成
- A.成员变量
- B.成员函数
- 2、类成员的访问权限
- 4、友元
- (1)Why(友元的作用)
- 5、聚合类
- (1)What(什么是聚合类)
- (2)Why(聚合类的作用)
- (3)How(如何定义和使用聚合类)
- 6、嵌套类
- (1)What(什么是嵌套类)
- (2)Why (嵌套类的作用)
- (3)How(如何使用嵌套类)
- 7、局部类
- (1)What(什么是局部类)
- (2)Why(局部类的作用)
- 8、union类
- 9、类成员指针
- 10、类的转换
1、类的概述
(1)What(什么是类)
本质是一个数据结构 = 变量 + 函数
(2)Why(类的作用)
类是面向对象变成的核心概念,它提供了一种组织和管理代码的方式,便于实现对世界的抽象和建模
(3)类的初始化
类是通过构造函数形成对象进行初始化的
(4)类的组成
A.成员变量
类的静态成员变量
静态成员和类相关联,不和对象相关联
类的一般成员变量
一般成员属于对象,和对象相关联
类的可变成员变量
永远不可能是 const,即使它是 const 类对象的成员变量,因此一个 const 成员函数可以改变可变数据成员
B.成员函数
const成员函数
这种类型的成员函数不能改变类对象的数据,只能访问类对象
成员函数的重载
同一作用域内,定义了两个或以上函数名相同,但函数的参数列表不同的函数
多态与重载的区别
- 定义:重载-多个相同的函数名,但参数列表和返回值类型存在着不同;多态-基类 对需要重写的函数进行 virtual 修饰,派生类重写 virtual 函数
- 绑定时机:重载是一种静态绑定-根据传入的参数类型和数量在编译时进行抉择;多 态是一种动态绑定-根据对象的类型在运行时进行抉择
注意:在类内部定义的成员函数自动是inline模式,也可以显式地指定成员函数为inline
2、类成员的访问权限
- public:公有成员在类内部、类的对象和类的派生类中都是可访问的
- protected:保护成员在类内部和派生类中都是可访问的,但类的对象不可访问
- private:私有成员只在类内部可访问,对于类的对象和派生类不可访问
权限关键字 | 类内部能否访问 | 派生类能否访问 | 外部能否访问 |
---|---|---|---|
public | 可以访问 | 可以访问 | 可以访问 |
protected | 可以访问 | 可以访问 | 不可以访问 |
private | 可以访问 | 不可以访问 | 不可以访问 |
4、友元
(1)Why(友元的作用)
- 访问私有成员:友元的主要作用是允许其他类或函数访问当前类的私有成员
- 增强类的交互:友元关系可以增强不同类之间的交互能力
- 降低代码依赖性提高封装性:通过将某个类或函数声明为友元,可以减少对外界暴露的接口
5、聚合类
(1)What(什么是聚合类)
本质是一个自定义类型的数据结构(结构体或类),但聚合类有以下特性:
- 所有的成员都是public
- 没有任何构造函数
- 没有基类
- 类内部没有初始值
(2)Why(聚合类的作用)
主要目的是提供一种简单且高效的方式来组织和管理数据。它们通常用于表示简单的 数据结构,如结构体或记录类型,而不涉及复杂的行为和操作
(3)How(如何定义和使用聚合类)
struct Point{
double dx;
double dy;
};
Point pt01 = {1.1, 2.2};
Point pt02{3.3, 4.4};
6、嵌套类
(1)What(什么是嵌套类)
定义或声明在类内部的类,它可以访问外部类的私有成员,并能在外部类作用域内使用
(2)Why (嵌套类的作用)
封装和隐藏:将嵌套类进行私有化,实现封装和隐藏
组织和结构化:将一个类嵌套到另一个类,可以清晰的表达两个类之间的关系
实现设计模式:如工厂模式、建造者模式等
命名空间嵌套:有助于避免命名空间冲突
(3)How(如何使用嵌套类)
class Student
{
private:
string name;
int age;
...
}
class Grade
{
private:
Student student; //Student在类Grade中声明,Student属于类Grade的嵌套类
...
}
7、局部类
(1)What(什么是局部类)
定义在函数内部或代码块中的类被称为局部类,它的作用域是该函数内部或代码块中
局部类具有以下特性:
- 不允许存在静态的成员
- 只允许访问外层作用域的静态变量、枚举和类型名
- 可以访问全局变量(使用:: ):😃
(2)Why(局部类的作用)
- 封装:隐藏细节
- 避免命名冲突:由于只对作用域可见,有助于避免命名冲突,提供更好的隔离性
- 增加代码的可维护性