一、类的引入
在我们学习C语言的时候,我们可以使用结构体将多中不同类型的变量“糅合”成一个新的变量,如定义一个学生的结构体:
struct Student
{
char name[20];
int age;
int ID;
};
学习C++后,我们可以使用类来将一个对象的属性与行为“糅合”在一起,如日期类包含日期的属性(年,月,日)和其行为(打印日期)
class Date
{
private:
int _year;
int _month;
int _day;
public:
Date(int year = 1, int month = 1, int day = 1)
{
_year=year;
_month=month;
_day=day;
}
void print()
{
cout << _year << "年" << _month << "月" << _day << "日" << endl;
}
};
二、类的定义
类的定义与结构体基本相同,将struct换位class,同时增加了private,public,protected属性以及构造和析构函数
1.关于访问限定符private和public
类将成员变量和成员函数都封装起来,默认为private,即只能在类的作用域内访问。而将其属性设置为public则相当于给外接提供了访问类的结构,类作用域外也可以访问类public属性的成员。
通过设置private和public,使得程序的封装性得到大幅提升,只允许外接通过接口来访问内部数据,保护了类的内部数据不被胡乱修改
2.构造和析构函数
构造函数的函数名与类名相同,创建对象的时候时编译器自动调用对应的构造函数
// 1.无参构造函数
Date()//设置默认日期
{
_year = 1;
_month = 1;
_day = 1;
}
// 2.带参构造函数
Date(int year, int month, int day)
{
_year = year;
_month = month;
_day = day;
}
// 3.拷贝构造函数
Date(Date& d)
{
_year = d.year;
_month = d.month;
_day = d.day;
}
析构函数:
概念:与构造函数功能相反,析构函数不是完成对象的销毁
局部对象销毁工作是由编译器完成的。而对象在销毁时会自动调用析构函数,完成类的一些资源清理工作
三、类的实例化
当我们完成了类的定义时,只是得到了一份图纸,而类的实例化则需生成对象,以日期类为例:
Date d1; //调用无参默认构造函数
Date d2(2021, 5, 20); //调用有参构造函数
Date d3(d1); //调用拷贝构造函数
注:若日期不合法将会报错(前提是我们在构造函数的实现已考虑不合法情况)
当生成了对象才实际占用存储空间,其中函数没有存到对象中,而是存在公共代码段
一个类的大小,实际就是该类中”成员变量”之和,遵循内存对齐,此外注意空类的大小,空类比较特殊,编译器给了空类一个字节来唯一标识这个类
四、this指针
根据对象中成员的存储,我们疑惑为什么不同对象的成员函数使用的是同一份,但是调用这份公共代码却能准确的作用于本对象中,由此我们引出this指针
1.this指针是隐含的,是编译器编译时加的,不能在函数参数处自己写出来
2.可以在函数内部使用this指针
3.this指针一般是存放在栈帧里,存储位置和编译器有关,VS编译器是存在寄存器里
this指针代码理解
Date d1(2021, 6, 28);
d1.print(); //等价于d1.print(&d1)