类的定义
类定义格式
• class为定义类的关键字,Stack为类的名字,{}中为类的主体,注意类定义结束时后⾯分号不能省 略。类体中内容称为类的成员:类中的变量称为类的属性或成员变量;类中的函数称为类的⽅法或 者成员函数。
也就是类包含一个是方法+变量
也就是比结构体多一个方法的处理
• 为了区分成员变量,⼀般习惯上成员变量会加⼀个特殊标识,如成员变量前⾯或者后⾯加_或者m 开头,注意C++中这个并不是强制的,
之后个人可以用m_
• C++中struct也可以定义类,C++兼容C中struct的⽤法,同时struct升级成了类,明显的变化是 struct中可以定义函数,⼀般情况下我们还是推荐⽤class定义类。
也就是typedef之类的都可以继续使用,挺好用的,当然cpp里面直接用名字就可以
• 定义在类⾯的成员函数默认为inline。
访问限定符
这里的就是struct和class的区别
public是都可以内外直接访问,protectedheprivate都是可以在类里面访问
访问权限作⽤域从该访问限定符出现的位置开始直到下⼀个访问限定符出现时为⽌,如果后⾯没有 访问限定符,作⽤域就到}即类结束
不加public默认私有
struct默认public
成员一般情况下都会定义为私有
C语言之中数据和方法是分离的
而在cpp中就是用类和对象框起来,之后就是将需要公开的方法公开,之后就是将不需要的加私有
而且还不用加上名字,接下来就是属于什么就是用什么类和对象
C语言之中分开就是对程序员的素养要求更高一些,不论是使用者还是编译者,如果说双方有一方是不契合,
cpp之中数据是私有的,那么该是什么方法直接用就可以,C语言之中可以直接访问数据,那么就是可能会不一样,而cpp直接就是插入直接就插入了
类域
类定义了⼀个新的作⽤域,类的所有成员都在类的作⽤域中,在类体外定义成员时,需要使⽤::作 ⽤域操作符指明成员属于哪个类域。
类域影响的是编译的查找规则,下⾯程序中Init如果不指定类域Stack,那么编译器就把Init当成全 局函数,那么编译时,找不到array等成员的声明/定义在哪⾥,就会报错。指定类域Stack,就是知 道Init是成员函数,当前域找不到的array等成员,就会到类域中去查找。
不同的类域里面可以同样的名字,
分离定义时和正常情况一样,但是头文件是只声明,不定义,实现文件需要制定类域
头文件
#include<iostream>
using namespace std;
class Stack
{
public:
// 成员函数
void Init(int n = 4);
8private:
// 成员变量
int* array;
size_t capacity;
size_t top;
};
实现文件
#include(头文件名字)
void Stack::Init(int n)
{
array = (int*)malloc(sizeof(int) * n);
if (nullptr == array)
{
perror("malloc申请空间失败");
return;
}
capacity = n;
top = 0;
}
实现文件中的函数还是属于头函数之中
实例化
实例化概念
• ⽤类类型在物理内存中创建对象的过程,称为类实例化出对象。
• 类是对象进⾏⼀种抽象描述,是⼀个模型⼀样的东西,限定了类有哪些成员变量,这些成员变量只 是声明,没有分配空间,⽤类实例化出对象时,才会分配空间。
• ⼀个类可以实例化出多个对象,实例化出的对象占⽤实际的物理空间,存储类成员变量。
类就像是游戏之中的图纸,图纸可以直接制造道具,但是需要自己去选择数据,确定参数,类用数据结构的看法就是类是逻辑结构,实例化就是变成物理结构
变量的声明和定义区别是是否开空间,
正常情况的化cpp是原本通过函数去访问,因为变量一般情况都不希望更改
对象⼤⼩
保持内存对齐的规则
第⼀个成员在与结构体偏移量为0的地址处。
• 其他成员变量要对⻬到某个数字(对⻬数)的整数倍的地址处。
• 注意:对⻬数=编译器默认的⼀个对⻬数与该成员⼤⼩的较⼩值。
• VS中默认的对⻬数为8
• 结构体总⼤⼩为:最⼤对⻬数(所有变量类型最⼤者与默认对⻬参数取最⼩)的整数倍。
• 如果嵌套了结构体的情况,嵌套的结构体对⻬到⾃⼰的最⼤对⻬数的整数倍处,结构体的整体⼤⼩ 就是所有最⼤对⻬数(含嵌套结构体的对⻬数)的整数倍。
类计算大小时至计算成员变量,不计算成员函数
为了防止浪费空间,函数全是重复
没有成员变量时需要有一个字节证明存在
实际情况不会储存空间,会在编译的时候直接确定,不论是编译的时候还是链接的时候
this指针
同一个函数被不同的对象调用,为什么数据不同
cpp编译器中自动加this
d1调用传d1的指针,2调用传d2的指针之后就是对不同的数据进行一个操作
c++中数据和函数都放到了类⾥⾯,通过访问限定符进⾏了限制,不能再随意通过对象直接修改数 据,这是C++封装的⼀种体现,这个是最重要的变化。这⾥的封装的本质是⼀种更严格规范的管 理,避免出现乱访问修改的问题。当然封装不仅仅是这样的,我们后⾯还需要不断的去学习。
C++中有⼀些相对⽅便的语法,⽐如Init给的缺省参数会⽅便很多,成员函数每次不需要传对象地 址,因为this指针隐含的传递了,⽅便了很多,使⽤类型不再需要typedef⽤类名就很⽅便
其实背后没有变,交给编译器的更多