前言
c语言是面向过程的语言,而c++是面向对象的语言,那么什么叫做面向过程,什么叫面向对象呢?
面向过程:
是主要侧重于过程,在c语言中我们所自定义的一些具有特定功能的函数来完成某些特定的操作,打个比方把大象装进冰箱需要1.牵出大象,2.打开冰箱门,3.把大象放进去,4.关上冰箱门这4个操作,那么放在c语言中是需要写出1.牵,2.打开,3.放,4.关这四个函数来实现这个把大象放进去的过程(c++是在c语言的基础上演化而来的,他也具备面向过程这一特性)
面向对象:
是主要侧重于对象,还是大象这个例子,但于面向过程分析的不同,面向过程分析的是如何,而面向对象侧重于“有谁”。按大象这个例子来说,有两个对象,一个对象是冰箱,还有一个是大象,而我们是对这个两个对象来进行封装和修饰的,比如冰箱需要对其封装出1.打开冰箱,2.放东西进入冰箱,3.关闭冰箱。而大象的话是需要1.牵引大象。这个操作。看起来和面向过程差不多但是差别还是很大的。
类
类的引入:
C语言结构体中只能定义变量,在
C++
中,结构体内不仅可以定义变量,也可以定义函数。
比如:
之前在数据结构初阶中,用C
语言方式实现的栈,结构体中只能定义变量
;现在以
C++
方式实现,
会发现
struct
中也可以定义函数。那么我是不是可以通过变量和函数来完成某些特定的功能
。
类的定义:
class为定义类的
关键字,
ClassName
为类的名字,
{}
中为类的主体,注意
类定义结束时后面
分
号不能省略
。
类体中内容称为类的成员:
类中的
变量
称为
类的属性
或
成员变量
;
类中的
函数
称为
类的方法
或者
成员函数
类的两种声明定义方式:
1. 声明和定义全部放在类体中,需注意:成员函数如果在类中定义
,编译器可能会将其当成
内
联函数
处理
2.类声明放在.h
文件中,成员函数定义放在
.cpp
文件中,
注意:
成员函数名前需要加类名
::
一般情况下,更期望采用第二种方式。
这里解释一下为什么需要加
ClassName::
,::是域操作符,因为你这个Function这个函数实在ClassName这个类中的,而你要在类外去用它需要解域,(详细解释放到了c++入门基础—域中做出了解释如果有不理解的可以去看一下)。
类的封装
访问限定符 :
1. public修饰的成员在类外可以直接被访问
2. protected和
private
修饰的成员在类外不能直接被访问
(
此处
protected
和
private
是类似的
)
3. 访问权限
作用域从该访问限定符出现的位置开始直到下一个访问限定符出现时为止
4. 如果后面没有访问限定符,作用域就到
}
即类结束。
5. class的默认访问权限为
private
,
struct
为
public(
因为
struct
要兼容
C)
(考虑一下struct也可以修饰类,那么strcut和class有什么区别呢?为什么大多数用的是 class可以向他们的作用域的方向去想一下)
注意:访问限定符只在编译时有用,当数据映射到内存后,没有任何访问限定符上的区别
封装:
将数据和操作数据的方法进行有机结合,隐藏对象的属性和实现细节,仅对外公开接口来
和对象进行交互。
封装的本质是一种管理,让用户使用起来更方便。比如我们电脑屏幕我们用鼠标点击应用,应用就启动了,而在电脑中需要繁琐的操作和指令来完成此操作,系统仅仅是把这一系列的操作给包装一下对外显示更为便捷的操作。
类的作用域:
在创建一个类时,类就产生了新的作用域,来隔绝外部,在类体外定义成员时,需要使用 ::作用域操作符指明成员属于哪个类域。(在访问类时也要注意他的限定修饰符看看是否能去访问)。
类的实例化 :
1. 类是对对象进行描述的
,是一个
模型
一样的东西,限定了类有哪些成员,定义出一个类
并没
有分配实际的内存空间
来存储它;
2. 一个类可以实例化出多个对象,
实例化出的对象
占用实际的物理空间,存储类成员变量
类对象模型 :
类中有成员变量还有成员函数那么我们怎么去计算一个类的大小呢?
类的大小的计算和结构体的大小计算相同,都遵循了内存对齐原则,而类中成员函数是不参与类大小的计算的。所以我们只需要计算类中的成员变量即可。
内存对齐原则:
1. 第一个成员在与结构体偏移量为
0
的地址处。
2. 其他成员变量要对齐到某个数字(对齐数)的整数倍的地址处。
注意:对齐数 = 编译器默认的一个对齐数 与 该成员大小的较小值 VS中默认的对齐数为8
3. 结构体总大小为:最大对齐数(所有变量类型最大者与默认对齐参数取最小)的整数倍。
4. 如果嵌套了结构体的情况,嵌套的结构体对齐到自己的最大对齐数的IEB整数倍处,结构体的整体大小就是所有最大对齐数(含嵌套结构体的对齐数)的整数倍。
this指针
概念:
C++编译器给每个“非静态的成员函数“增加了一个隐藏 的指针参数,让该指针指向当前对象(函数运行时调用该函数的对象),在函数体中所有“成员变量”的操作,都是通过该指针去访问。只不过所有的操作对用户是透明的,即用户不需要来传递,编译器自动完成。
特性:
1. this
指针的类型:类类型
* const
,即成员函数中,不能给
this
指针赋值。
2. 只能在“
成员函数
”
的内部使用
3. this
指针本质上是
“
成员函数
”
的形参
,当对象调用成员函数时,将对象地址作为实参传递给
this
形参。所以
对象中不存储
this
指针
。
4. this
指针是
“
成员函数
”
第一个隐含的指针形参,一般情况由编译器通过
ecx
寄存器自动传
递,不需要用户传递。