C++类与对象总结
Auto:语法糖
高耦合: 类内部的管理
低类聚: 类与类之间的通讯接口
nullptr:空定义 类型:void*
类与对象的认知:
-
类与对象的初步认识
-
类的引入
C++更常用class代替
C语言中,结构体只能定义变量,在C++中,结构体不仅可以定义变量,也可以定义函数
- 类的定义
类的定义
类名,成员变量,成员函数
两种定义方式(hpp ; .h与
.cpp)
class className
{
// 类体:由成员函数和成员变量组成
}; // 一定要注意后面的分号
Class为定义类的关键字,ClassName为类的名字,’{ }’,中为类的主体,注意类定义结束时后面分号.
类中的元素称为类的成员: 类中的数据称为类的属性或者成员变量;类中的函数称为类的方法或者成员函数
类的两种定义方式:
1).声明和定义全部放在类体中,需要注意: 成员函数如果在类中定)义,编译器可能会将其当成内联函数处理.
2).声明与类分离
声明放在类的头文件person.h
定义放在类的实现文件person.cpp中
- 封装和类的访问限定符
面向对象三大特征: 封装 继承 多态
Struct和Class的区别:struct完全是开放的,可以访问任意成员
struct(类):默认访问限定符公有
class:默认访问限定符私有
设计原则:成员变量私有 可调用函数公有
public(公有)private(私有)
类的访问限定符与封装
Public, protrcted,private;作用域
封装: 隐藏随想的属性和实现细节,仅对外公开接口和对象进行交互
优点:数据和方法都封装都封装在类里面,有利于管理
类的作用域:
访问限定符: public(公有) protected(保护) private(私有)
-
public修饰的成员在类外可以直接被访问
-
protected和private修饰的成员在类外不能直接被访问(此处protected和private是类似的)
-
访问权限作用域从该访问限定符出现的位置开始直到下一个访问限定符出现时为止
-
class的默认访问权限为private,struct为public(因为struct要兼容C)
注意:访问限定符只在编译时有用,当数据映射到内存后,没有任何访问限定符上的区别
在类体外定义成员,使用 :: 作用域解析符
作用域外,借助成员访问操作符,和’->’来访问类成员
类的实例化:
用类型创建对象的过程,称为类的实例化
a. 类只是一个模型
b. 实例化出为对象
类像是模型,不占空间,实例化的对象才占用存储空间
类可以实例化出多个对象:无数个
类的对象大小的计算:
规则:
成员函数不计入大小 + 内存对齐规则
a. 对象中包含类的各个成员
b. 只保存成员变量,成员函数存放在公共的代码段
结构体内存对齐规则: 内存对齐 空间换时间
a) 第一个成员在与结构体偏移量为0的地址处
b) 其他成员变量要对齐到某个数字(对齐数)的整数倍的地址处。 注意:对齐数 = 编译器默认的一个对齐数 与 该成员大小的较小值。 VS中默认的对齐数为8,gcc中的对齐数为4
c) 结构体总大小为:最大对齐数(所有变量类型最大者与默认对齐参数取最小)的整数倍。
d) 如果嵌套了结构体的情况,嵌套的结构体对齐到自己的最大对齐数的整数倍处,结构体的整体大小就是
所有最大对齐数(含嵌套结构体的对齐数)的整数倍。
空类的特殊情况: 编译器给了空类一个字节来唯一标识这个类
类成员函数的this指针:
This指针特性:
a) this指针的类型:类类型* const
b) 只能在“成员函数”的内部使用
c) this指针本质上其实是一个成员函数的形参,是对象调用成员函数时,将对象地址作为实参传递给this 形参。所以对象中不存储this指针。
d) this指针是成员函数第一个隐含的指针形参,一般情况由编译器通过ecx寄存器自动传递,不需要用户 传递
每个成员函数都有一个隐式的指针形参且是第一个形参,构造函数除外
编译器传递方式: 对象地址作实参传递给成员函数的this指针
This指针存在栈上(vs环境上存在寄存器上)