类和对象(上)
1.面向过程和面向对象初步认识
c语言是面向过程的,关注的是过程,分析出求解问题的步骤,通过函数调用逐步解决问题
C++是基于面向对象的,关注的是对象,将一件事情拆分成不同的对象,靠对象之间的交互完成
2.类的引入和定义
2.1引入
C语言结构体中只能定义变量,在C++中,结构体升级成了类,使它不仅可以定义变量,还可以定义函数
C++中更喜欢用class来代替struct
2.2定义
class className
{
// 类体:由成员函数和成员变量组成
}; // 一定要注意后面的分号
class是定义类的关键字,className是类名,{}中为类的主体,结尾分号不能省略
类中的内容称为类的成员;类中的变量称为类的属性或成员变量;类中的函数称为类的方法或成员函数
两种定义方式:
1.声明和定义都放在类中:如果成员函数在类中定义,编译器可能会将其当成内联函数处理
2.类声明放在.h文件中,成员函数定义放在.cpp文件中:成员函数名前需要加 类名::
3.类的访问限定符及封装
3.1访问限定符
C++实现封装的方式:用类将对象的属性与方法结合在一块,让对象更加完善,通过访问权限选择性的将其接口提供给外部的用户使用
访问限定符说明:
1.public修饰的成员在类外可以直接被访问
2.protected和private修饰的成员在类外不能被直接访问
3.访问权限作用域从该访问权限符出现的位置开始到下一个访问限定符出现时为止
4.如果后面没有访问限定符,作用域到}即类结束
5.class的默认访问权限为private,struct为public(因为要兼容C)
注意:访问限定符只在编译时有效,当数据映射到内存后,没有任何访问限定符上的区别
3.2封装
面向对象的三大特性:封装、继承、多态
封装:将数据和操作数据的方法进行有机结合,隐藏对象的属性和实现细节,仅对外公开接口来和对象进行交互。本质上是一种管理,让用户更方便使用类
4.类的作用域
类定义了一个新的作用域,类的所有成员都在类的作用域中。在类外定义成员时,需要使用 :: 作用域操作符指明成员属于哪个类域
5.类的实例化
用类类型创建对象的过程,称为类的实例化
1. 类是对对象进行描述的,定义出一个类并没有分配实际的内存空间来存储它
2. 一个类可以实例化出多个对象,实例化出的对象 占用实际的物理空间,存储类成员变量
6.类对象模型
6.1如何计算类对象的大小
1. 一个类的大小为:该类中成员变量之和(内存对齐)
2. 对象中只存储成员变量,没有存储成员函数
3. 空类需要1byte,是为了占位,表示对象存在,不存储有效数据
6.2结构体内存对齐规则
1. 第一个成员在与结构体偏移量为0的地址处
2. 其它成员变量要对齐到对齐数的整数倍的地址处。对齐数 = 编译器默认对齐数 与该成员大小的较小值(VS中默认对齐数为8)
3. 结构体总大小: 最大对齐数(所有变量类型最大者 与 默认对齐参数取最小)的整数倍
4.若嵌套的结构体,嵌套的结构体对齐到自己的最大对齐数的整数倍处,结构体的整体大小就是所有最大对齐数的整数倍
补充:
为什么要内存对齐?
空间换时间,计算机一次访问多个字节
7.this指针
7.1this指针的引出
C++给每个”非静态的成员函数“增加了一个隐藏的指针参数,让该指针指向当前对象(函数运行时调用该函数的对象),在函数体中所有“成员变量”的操作,都是通过该指针去访问。编译器自动完成。
7.2this指针的特性
1. this指针的类型:类类型*const,即成员函数中,不能给this指针赋值
2. 只能在“成员函数”的内部显示使用,不能在形参和实参显示传递
3. this指针本质上是“成员函数的形参”。对象中不存储this指针
4. this指针是“成员函数“第一个隐含的指针形参,一般情况由编译器通过ecx寄存器自动传递
补充:
1. this指针存在哪里?
this是形参,所有this指针是跟普通参数一样存在函数调用的栈帧里面
在vs下,对this指针传递,进行优化,对象地址是放在ecx,ecx存储this指针的值
2. this指针可以为空吗?
可以,访问空的this指针是未定义行为
1万+

被折叠的 条评论
为什么被折叠?



