目录
一.面向过程和面向对象初步认识
我们都知道C语言是面向过程的,而C++是面向对象的
比如洗衣服:
C语言看重的是洗衣服的过程:拿衣服,放水,手搓....关心每个步骤是如何完成的
C++看重的是几个对象:人,衣服,洗衣机,洗衣粉...关心每个对象之间的相互依赖。
二.类的引入
C
语言结构体中只能定义变量,在
C++
中,结构体内不仅可以定义变量,也可以定义函数,并且C++兼容C。
3.类的定义
class
为
定义类的
关键字,
ClassName
为类的名字,
{}
中为类的主体,注意
类定义结束时后面
分
号不能省略
。
类体中内容称为
类的成员:
类中的
变量
称为
类的属性
或
成员变量
;
类中的
函数
称为
类的方法
或者
成员函数
。
第一种定义方式:声明和定义放在类里面
第二种:声明和定义分离
4.类的访问限定符及封装
1.访问限定符:
C++
实现封装的方式:
用类将对象的属性与方法结合在一块,让对象更加完善,通过访问权限选
择性的将其接口提供给外部的用户使用。
public 公有):
private (私有):
protected(保护)
1. public
修饰的成员在类外可以直接被访问
2. protected
和
private
修饰的成员在类外不能直接被访问
(
此处
protected
和
private
是类似的
)
3.
访问权限
作用域从该访问限定符出现的位置开始直到下一个访问限定符出现时为止
4.
如果后面没有访问限定符,作用域就到
}
即类结束。
5. class
的默认访问权限为
private
,
struct
为
public(
因为
struct
要兼容
C)
C++中class和struct在目前来看,因为C++兼容C,C++也能把struct当结构体使用,也可以定义类,目前的区别只限于没有访问限定符时,默认的权限不一样。
2.封装:
面向对象的三大特性(面向对象的语言):
封装、继承、多态
。
在类和对象阶段,主要是研究类的封装特性,那什么是封装呢?
封装:封装的本质是一种管控
1.C++数据和方法都放在类里面,而C语言是分离的。
2.C++访问限定符对成员进行限制,能访问是公有,不能是私有或保护。
比如:对于电脑这样一个复杂的设备,提供给用 户的就只有开关机键、通过键盘输入,显示器,USB
插孔等,让用户和计算机进行交互,完成日 常事务。但实际上电脑真正工作的却是CPU
、显卡、内存等一些硬件元件。
比如:我们走直到每个公司都有保安,如果没有保安,任何人都能自由进入进出,就会导致出各方面问题,如果有保安,则对公司进行了保护,对某些人进行了限制和管控。
5.类的作用域
类定义了一个新的作用域
,类的所有成员都在类的作用域中
。
在类体外定义成员时,需要使用
::
作用域操作符指明成员属于哪个类域。
6.类的实例化
用类类型创建对象的过程,称为类的实例化:
1.
类是对对象进行描述的
,是一个
模型
一样的东西,限定了类有哪些成员,定义出一个类
并没
有分配实际的内存空间
来存储它。
比如建房子,先看图纸,根据图纸上的内容来做。
图纸相当于声明,做相当于实例化。
2.
一个类可以实例化出多个对象,
实例化出的对象
占用实际的物理空间,存储类成员变量
7.类的对象大小的计算
1.如何计算类对象的大小:
和C语言一样都要遵循内存对齐规则。
结果只算了成员变量,没有算成员函数。
2.类对象的储存方式猜测:
缺陷:每个对象中成员变量是不同的,但是调用同一份函数,如果按照此种方式存储,当一
个类创建多个对象时,
每个对象中都会保存一份代码,相同代码保存多次,浪费空间。那么
如何解决呢?
代码只保存一份,在对象中保存存放代码的地址
只保存成员变量,成员函数存放在公共的代码段
比如:每个社区都有公共区域(成员函数),如健身房,而家具用品(成员变量)就是每户人都有的
由此发现d1,d2的地址不一样,但他们的成员函数地址是一样的
空类的大小是多少呢?
没有成员变量的类大小是1字节,为什么不是0呢?
假如定义 d1,d2 如果为0那他们开的空间也是0,不符合常理,所以为了表示对象定义实例化时存在过,所以规定空类大小为1字节。
8.类成员函数的this指针
1 this指针的引出:
我们先来定义一个日期类 Date
对于上述类,有这样的一个问题:
Date
类中有
Init
与
Print
两个成员函数,函数体中没有关于不同对象的区分,那当
d1
调用
Init
函
数时,该函数是如何知道应该设置
d1
对象,而不是设置
d2
对象呢?
C++
中通过引入
this
指针解决该问题,即:
C++
编译器给每个
“
非静态的成员函数
“
增加了一个隐藏
的指针参数,让该指针指向当前对象
(
函数运行时调用该函数的对象
)
,在函数体中所有
“
成员变量
”
的操作,都是通过该指针去访问。只不过所有的操作对用户是透明的,即用户不需要来传递,编
译器自动完成
。
2 this
指针的特性 :
1.
this
指针的类型:类类型
* const
,即成员函数中,不能给
this
指针赋值。
const在*后不能改变指针本身,在*之前不能改变指针指向的内容
2.
只能在
“
成员函数
”
的内部使用,不能显示着传
3.
this
指针本质上是
“
成员函数
”
的形参
,当对象调用成员函数时,将对象地址作为实参传递给
this
形参。所以
对象中不存储
this
指针
。
4.
this
指针是
“
成员函数
”
第一个隐含的指针形参,一般情况由编译器通过
ecx
寄存器自动传
递,不需要用户传递
1. this
指针存在哪里?
堆,栈,静态区,常量区,对象里面
首先排除对象里面,因为之前算类的大小没有算this指针。
this指针是被const修饰的,但不是所有const修饰的都在常量区,变量a在栈区,const修饰的b的地址和a的地址是挨着的,所以b也不是在常量区,而this作为一个形参所以放在栈区,而p指向的区域则是在常量区。
静态区只有static修饰或全局的。
动态内存开辟的才会放在堆区。