C++类和对象

前言

1、个人对类和对象的理解

C++和C的最大一个点在于,前者是通过一个个的结构体去实现操作和需求的,后者就需要自己去实现一个个的接口,一步一步的去完成需求;两者对比下来,C++的编程的便捷性是大大高于C语言的,就好像手洗衣服,和洗衣机洗衣服,手洗就需要过水,拧干,机洗就不需要去关系他是怎么洗的,只需要知道可以把衣服洗干净并且脱水即可。

一、什么是类

1、类的引入

在C语言中的结构体(struct)中,只能在结构体里面添加和设置变量,并不可以设计函数;而到了C++之后,因为C++是兼容C语言的,所以在C++中的结构体不仅仅可以添加变量,还可以设计接口。

2、类的格式及定义

因为C++兼容C语言,所以struct和class都可以创建一个类(但是C++更加喜欢用class来定义一个类),如何定义一个类,格式如下:

class person
{
	
};

class为定义类的关键字,ClassName为类的名字,{}中为类的主体,注意类定义结束时后面
号不能省略
。类体中内容称为类的成员:类中的变量称为类的属性或成员变量; 类中的函数称为类的方法或者成员函数。
在定义类中的成员函数时候有两种方法:
1、在类的累不定义成员函数的话,成员函数有可能会成为内联函数
2、类的声明和定义分离,假设类的声明放在.h文件中,类的定义放在.cpp文件中,这个时候,就需要在定义的时候给成员函数加上作用域限定符如:

在这里插入图片描述

3、访问限定符

而对于类里面的成员访问有三种访问方式:
1、public:公有访问,不管是在类里还是类外都可以访问到类的成员
在这里插入图片描述

2、protected:保护访问,只能给派生类访问(继承的知识)和类里,不能被类外访问成员

在这里插入图片描述

3、private:私有范围,只能被类里访问,不能被类外访问
在这里插入图片描述
4. 如果后面没有访问限定符,作用域就到 } 即类结束。
5. class的默认访问权限为private,struct为public(因为struct要兼容C)

4、类的特性

面向对象的三大特性:封装、继承、多态。
在类和对象阶段,主要是研究类的封装特性,那什么是封装呢?
**封装:将数据和操作数据的方法进行有机结合,隐藏对象的属性和实现细节,仅对外公开接口来
和对象进行交互。**封装本质上是一种管理,让用户更方便使用类。在C++语言中实现封装,可以通过类将数据以及操作数据的方法进行有机结合,通过访问权限来隐藏对象内部实现细节,控制哪些方法可以在类外部直接被使用。

5、类的作用域

类定义了一个新的作用域,类的所有成员都在类的作用域中。在类体外定义成员时,需要使用 ::
作用域操作符指明成员属于哪个类域。

在这里插入图片描述

二、类的实例化

在用类来创建一个类对象的过程叫做类的实例化
在这里插入图片描述
这里的p1就是通过person这个类创建出来的

1、类的定义和类的实例化

类的定义实际是不分配空间去储存它的的,但是需要注意一点的是空类是占据一个字节的,这是要告诉编译器有这个类;只有通过类去创建对象的这个过程才会消耗空间,一个类可以创建多个不同名的对象,这些对象里面的成员就需要空间储存。
在这里插入图片描述

三、类的大小计算(数据对齐)

1、类的大小由什么决定

在这里插入图片描述
结果:类的大小是由于“成员变量”决定的,当然要注意内存对齐,注意空类的大小,空类比较特殊,编译器给了空类一个字节来唯一标识这个类的对象。

2、内存对齐规则

1、 第一个成员在与结构体偏移量为0的地址处。
2、 其他成员变量要对齐到对齐数的整数倍的地址处。
注意:对齐数 = 编译器默认的一个对齐数 与 该成员大小的较小值。VS中默认的对齐数为8
3、 结构体总大小为:最大对齐数(所有变量类型最大者与默认对齐参数取最小)的整数倍。
4.、如果嵌套了结构体的情况,嵌套的结构体对齐到自己的最大对齐数的整数倍处,结构体的整
体大小就是所有最大对齐数(含嵌套结构体的对齐数)的整数倍。

四、 this指针

1、this指针的作用

在这里插入图片描述
在这里插入图片描述
由上面的过程,可以看出在date类中init函数和print函数,并没有指出这两个类里的函数是d1的还是d2的,但是d1和d2打印出的结果完全不一样,之所以会有这样的效果,是因为C++在对非静态的成员函数中加入了隐藏的this指针,当创建出一个对象后,这个this指针会指着被实例化出来的对象(this指针就会成为成员函数的一个形参),通过this指针去访问成员变量,不同的对象this指针也是不一样的
在这里插入图片描述

2、 this指针的特性

1、 this指针的类型:const类类型* this ,即成员函数中,不能给this指针赋值。
2、只能在“成员函数”的内部使用
3、this指针本质上是“成员函数”的形参,当对象调用成员函数时,将对象地址作为实参传递给
this形参。所以对象中不存储this指针。
![在这里插入图片描述](https://img-blog.csdnimg.cn/direct/676e2194b82c4d879fcc0d41b17660f2.png
4、this指针是“成员函数”第一个隐含的指针形参,一般情况由编译器通过ecx寄存器自动传
递,不需要用户传递

4、this指针的总结

1、this指针存在哪里?
Ec++存放在exc寄存器中,其他编译器可能不一样。
2、 this指针可以为空吗?
可以,但前提是不需要对这个实例化出来的类对象进行操作(不可以解应用)
3、this指针存放的是声明?
this指针存放的是这个实例化出来的类的首地址。
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值