今天我们来了解C++中,类与对象的一些知识。
包括了:类的定义,访问限定符,类域,实例化与内存对齐,this 指针 。
class为定义 类 的关键字,类的代码实例:

{ }中为类的主体,括号后面有一个不可缺少的分号 ; 类名则和定义一个整型变量a一样。
类中的变量称为类的属性或者成员变量,类中的函数称为类的方法或者成员函数。
需要注意,定义在类里面的成员函数默认为inline(内联函数)
说到类,不得不提与其密切相关的访问限定符
访问限定符有三种:public,protected,private
C++的访问限定符是面向对象编程的核心特点之一,主要用于控制类成员的访问权限,从而实现封装,让对象更完善,提高了代码的安全性与灵活性(可选择性的将类的成员提供给外部的用户使用)
1.public修饰的成员是可以直接被访问和使用的,也就是字面意思,公开的
2.同理,protected和private则是不能被直接访问和使用的
3.class定义的成员没有被访问限定符修饰的默认为private,struct默认为public
4.访问限定符的作用域仅在其最开始出现的位置开始,下一个出现时结束,若后面再无,则到右大括号 } 结束。说出来恐难以理解,以下是代码示例:

如图所示,相信已非常直观。
接下来,我们再拓展一个知识,类域。
类域,即类定义的一个新的作用域。
类的所有成员都在其作用域中,在类体外定义成员时,需要使用 ::这个作用域操作符来指明成员属于哪个类域。

用类类型在物理内存中创建对象的过程,称为类实例化出对象
类是对象进行一种抽象描述,是⼀个模型⼀样的东西,限定了类有哪些成员变量,这些成员变量只
是声明,没有分配空间,⽤类实例化出对象时,才会分配空间

只有投入使用时,例如一个栈stack,只有我创建了一个栈 stack st,这时候才算实例化,此时才会开空间。
既然开始分配空间后,那对象的空间也会有大小的问题:其实C++规定类实例化的对象也要符合内存对齐的规则。
内存对齐的规则:
1.第⼀个成员在与结构体偏移量为0的地址处。
2.其他成员变量要对齐到某个数字(对齐数)的整数倍的地址处。
3.注意:对齐数 = 编译器默认的⼀个对齐数 与 该成大小的较小值。
4.VS中默认的对齐数为8
5.结构体总大小为:最大对齐数(所有变量类型最大者与默认对齐参数取最小)的整数倍。
6.如果嵌套了结构体的情况,嵌套的结构体对齐到自己的最大对齐数的整数倍处,结构体的整体大小就是所有最⼤对齐数(含嵌套结构体的对齐数)的整数倍。
出个几个小题:
// 计算⼀下A实例化的对象是多⼤?
class A
{
public:
void Print()
{
cout << _ch << endl;
}
private:
char _ch;
int _i;
};答案:类A实例化对象大小是8字节。
char _ch从0开始占了1字节,然后int _i在第4位开始对齐,占了4字节,中间因为对齐空了3字节空间,总计8字节。
接下来这两题:
class C
{};
class B
{
public:
void Print()
{
//...
}
};答案:都是1字节
结果反常的不是0,因为给1字节是为了占位,证明其存在过,这点记住即可。
编译器编译后,类的成员函数默认都会在形参第⼀个位置,增加⼀个当前类类型的指针,叫做this
指针。
举例:
class Date
{
public:
// void Init(Date* const this, int year, int month, int day)
void Init(int year, int month, int day)
{
_year = year;
this->_month = month;
this->_day = day;
}
private:
int _year;
int _month;
int _day;
};可看到public后的第一行注释,其中参数与实际的Init函数相差了一个当前类类型的指针,这就是thi指针。C++规定不能在实参和形参的位置显⽰的写this指针(编译时编译器会处理),但可以在函数体内显示的使用this指针(如下)
注意到该指针为 Date* const this,说明不支持修改this指针,this的指向不允许被改变
同时,Init函数内,有 this->_month 的写法,其实一般可以不这么写,此处仅为展示,
类的成员函数中访问成员变量,本质都是通过this指针访问的,如Init函数中给_year赋值, this-
>_year = year;
内容如果有误,请在评论区指出,谢谢指导。接下来我会继续更新C++,请大家多多支持哟