嗨~大家好,这里是春栀怡铃声的博客~

"做你害怕的事,然后发现,不过如此~"
目录
[this 指针](#this 指针)
类域
类定义了一个新的作用域,类的所有成员都在类的作用域中,在类体外定义成员时,需要使用
:: 作用域操作符指明成员属于哪个类域。
而函数的声明、定义分离,则需要特别说明类域,比如函数的声明在类中,而定义则在类外显示
如下:
cpp
class Date
{
public:
Date(int year,int month,int day) {
_year = year;
_month = month;
_day = day;
}
void Print();
private:
int _year;
int _month;
int _day;
};
void Date::Print()
{
cout << _year << "/" << _month << "/" << _day << endl;
}
注意!void 在类名的前面
void Date::Print();
类的定义
类定义格式
cpp
class Date
{
public:
Date(int year,int month,int day) {
_year = year;
_month = month;
_day = day;
}
void Print()
{
cout << _year << "/" << _month << "/" << _day << endl;
}
private:
int _year;
int _month;
int _day;
};
class为定义类的关键字 ,Date 为类的名字,{}中为类的主体 ,注意类定义结束时后面分号不能省 略。
类体中内容称为类的成员:类中的变量称为类的属性或成员变量;(为了区分成员变量,⼀般习惯上成员变量会加⼀个特殊标识,如成员变量前面或者后面加 _ 或者m 开头,注意C++中这个并不是强制的)
类中的函数称为类的方法或者成员函数 。定义在类里面的成员函数默认为inline。
在上面代码中 _year 、 _month 、_day 属于成员变量;Print 、Date 属于成员函数
还有一种类是 struct 类型,这种类中的所有成员都是可以在类域外直接访问的
访问限定符
访问限定符: public、private、protected
访问限定符是通过 访问权限选择性 的将其接口提供给外部的用户使用
public 中的成员**,类域外可以访问**
而protected 、 private 中 的成员类域外不可访问
class定义成员没有被访问限定符修饰时默认为private,struct默认为public。
⼀般成员变量都会被限制为private/protected,需要给别人使用的成员函数会放为public。
实例
类就像是建房子的图纸,而对象则是通过类(图纸)建造出来的房子。
类里面的成员只是一种声明,并不开空间,设计图纸而已,并不能真正住人
类是对象进行⼀种抽象描述,是⼀个模型⼀样的东西,限定了类有哪些成员变量,这些成员变量只
是声明,没有分配空间,用类实例化出对象时,才会分配空间。
一个类可以实例化出多个对象
对象大小
先来分析对象中的成员:变量、函数,变量有各种类型的,需要内存对齐
而函数被编译后是一段指令,指令存储是存储到特定区域而不是对象当中,由此看来剩下函数指针
无论建立多少个对象,函数指针都不会变,存储函数指针并没有意义
所以对象的大小由变量来决定。 变量又有不同类型,这又需要内存对齐的知识了
内存对齐
1.vs默认对齐数是8
2.结构体总大小为:最大对齐数(所有变量类型最大者与默认对齐参数取最小)的整数倍。
3.对齐数是变量类型与默认对齐数之中更小的那个
4.第一个成员在与结构体偏移量为0的地址处。
5.其他成员变量要对齐到某个数字(对齐数)的整数倍的地址处。
在vs平台下 来试试算a 的大小
cpp
#include<iostream>
using namespace std;
class A
{
public:
void Print()
{
cout << _ch << endl;
}
private:
char _ch;
int _i;
};
int main()
{
A a;
cout << sizeof(a) << endl;
return 0;
}
首先算对齐数,vs默认对齐数是8 ,int 类型占用字节数是4 ,相比之下,4小于8 对齐数是4
画图

this 指针
请看这段代码
cpp
#include<iostream>
using namespace std;
class Date
{
public:
//void Init(Date* const this, int year, int month, int day)
void Init(int year, int month, int day)
{
_year = year;
_month = month;
_day = day;
}
void Print()
{
cout << _year << "/" << _month << "/" << _day << endl;
}
private:
int _year;
int _month;
int _day;
};
int main()
{
// Date类实例化出对象d1和d2
Date d1;
Date d2;
d1.Init(2024, 3, 31);
d1.Print();
d2.Init(2024, 7, 5);
d2.Print();
return 0;
}
我们创建了2个对象d1、d2 在调用类中函数实现功能时,是怎么区分d1,d2的呢
欸,这里就引入了this 指针
类的成员函数默认都会在形参第⼀个位置,增加⼀个当前类类型的指针,叫做this 指针。
其实在上面代码中,函数还隐藏了一个参数,真正的成员函数如下:
void Init(Date* const this, int year, int month, int day)
每次调用Init 函数时,会把当前对象的地址也传过去,这样就不会搞错,一一对应,像下面所示,不过在正常编译时,并不能这样写
d1.Init(&d1, 2024, 3, 31);
this 指针注意事项:
C++规定不能在实参和形参的位置显示的写this指针(编译时编译器会处理),但是可以在函数体内显示使用this指针。
什么意思呢,就是在成员函数中可以显示出this 指针,其他地方不需要你加this ,霸道的编译器帮你处理了
void Init(int year, int month, int day)
{
this->_year = year;
this->_month = month;
this->_day = day;
}