1、this指针
class Date
{
public:
void Init(Date* this, int year, int month, int day)
{
this->_year = year;
this->_month = month;
this->_day = day;
this->Print();
// 这就是this指针,是编译器自己加的,是用来让成员函数找到成员变量的位置的;
// this在实参和形参位置不能显示写,但在类里面可以显示的用;
cout << this << endl;
}
void Print()
{
cout << _year << endl;
}
private:
int _year;
int _month;
int _day;
};
小扩展:
1)this指针存在哪?(栈、堆、静态区、常亮区)
答:this是一个形参,一般是存在栈里面;有些编译器(如VS)会优化,直接用寄存器加载;
2、类的6个默认成员函数
如果一个类中什么成员都没有,简称为空类;
空类中真的什么都没有吗?其实并不是,任何类在什么都不写时,编译器也会自动生成6个默认成员函数;
默认成员函数的定义也就是用户没有显式实现,编译器会自动生成的成员函数;
六个默认成员函数:
- 初始化和清理:构造函数主要完成初始化的工作;析构函数主要完成清理工作;
- 拷贝复制:拷贝构造是使用同类对象初始化创建对象;赋值重载主要是把一个对象赋值给另一个对象;
- 取地址重载:主要是普通对象和const对象取地址,这两个很少会自己实现;
构造函数:
构造函数是特殊的成员函数,需要注意的是,构造函数虽然名称叫构造,但是构造函数的主要任务并不是开空间创建对象,而是初始化对象。
特征:1)函数名与类名相同;2)无返回值(void也不需要写);3)对象实例化时编译器自动调用对应的构造函数;4)构造函数可以重载(写多个构造函数,提供多个初始化方式);
class Date
{
public:
Date()
{
_year = 1;
_month = 1;
_day = 1;
}
Date(int year, int month, int day)
{
_year = year;
_month = month;
_day = day;
}
// 将上述两个构造函数合并为一个全缺省构造函数,更为灵活;
Date(int year = 1, int month = 1, int day = 1)
{
_year = year;
_month = month;
_day = day;
}
void Print()
{
cout << _year << "/" << _month << "/" << _day << endl;
}
private:
int _year;
int _month;
int _day;
}
int main()
{
Date dd; // 此处注意不能写成“Date dd()”,会识别成一个函数声明的;
dd.Print(); // 咱们这里会发现dd已经被初始化为“1/1/1”了,如果没有构造函数,这里出来的会是随机值;
Date dd2(2023, 01, 01);
dd2.Print(); // 此处输出“2023/01/01”;
return 0;
}