第七章 类
关键点
- 类的思想
- 各种成员函数类型
- 类的作用域
设计类的目的:数据抽象和封装
成员函数
定义在类内部的函数是隐式的inline函数
成员函数通过名为
this
的隐式形参来访问调用这个函数的对象成员函数的参数列表之后可以跟一个const,表示该成员函数是常量成员函数,即调用该函数时的
this
是指向常量对象的常量指针(默认是指向非常量的常量指针)- 常量对象,以及常量对象的指针和引用,只能调用常量成员函数
类的作用域
类的构造函数
- 当且仅当类没有声明任何构造函数时,编译器才会为类自动生成默认构造函数
=default
显式地要求编译器声明默认构造函数- 形参列表之后可以通过冒号和构造函数初始值列表,来为新对象中的一些成员变量赋初值
- 在初始值列表中进行初始化和赋值初始化是不同的
数据的初始化顺序,与类中这些成员的声明顺序有关,与列表中的顺序无关
- 因此最好让初始值列表的成员顺序与类中的声明顺序一致,否则互相调用的成员初始化可能会出错
C++11新增委托构造函数,即使用其他构造函数执行自己的初始化过程,但是它的初始值列表只有一个入口,即类名本身
- 会先执行被委托的构造函数体,再执行委托者的构造函数体
- 默认构造函数的使用情况
访问控制与封装
struct和class都能用来声明类,只是两者的默认权限不一样
默认访问权限对出现在第一个权限声明符(
private:
orpublic:
)之前的成员生效struct默认public,class默认private
可以在类内部声明友元,从而允许访问私有的成员或函数(友元只是声明了权限,类外部必须再次声明函数)
类的其他特性
- 定义一个类型成员
- 使用mutable关键字,可以使得const对象的该成员可以被修改
返回调用对象的引用:return *this;这样就可以连续调用成员函数了(有java那味儿了)
注:非常量版本的成员函数对常量对象是不可用的;常量对象return *this的结果还是常量对象
类的类型转换:类的构造函数(只有一个实参)隐式地定义了类型转换的方式。注:编译器只会执行一步类型转换
- 可以使用explicit来阻止这种隐式转换
字面值常量类:
类的作用域
- 一个类就是一个作用域
- 名字匹配的顺序依旧是由内而外
- 当发生目标变量被隐藏的情况时,可以用this访问对象的成员,用::表明作用域访问类外部(全局)的变量
类的静态成员
静态成员,表明该成员直接与类相关,而不是和每个对象相关,关键词为static
类的静态成员数据存在于任何对象之外,只是表示数据的从属关系
- 但是仍然可以通过对象(包括指针和引用)来访问静态成员(只要该成员为public)
静态成员函数也不与任何对象绑定,因此函数内不可使用this指针,也不能被声明为const
可以直接通过类名(作用域)来访问静态成员
静态成员可以作为函数的默认实参
静态成员可以是不完全类型(还未完全定义的类),如在一个类内声明自己
- Title: 第七章 类
- Author: Huan Lee
- Created at : 2023-08-20 13:07:37
- Updated at : 2024-02-26 04:53:15
- Link: https://www.mirthfullee.com/2023/08/20/notion-第七章 类-1facc976/
- License: This work is licensed under CC BY-NC-SA 4.0.