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指针存放的是这个实例化出来的类的首地址。