//class Date
//{
//public:
// //建议尽量使用初始化列表初始化
// //成员变量的定义放在初始化列表里,每个成员变量都会走初始化列表,初始化列表里不写也会走
// //没写就走默认构造(不传参数就能调用的),要是连默认构造都没有,就会报错
//
// //初始化列表初始化的顺序按照声明里给的顺序,与初始化列表里的顺序无关
// Date(int year = 1, int month = 1, int day = 1)
// //上面的缺省值用不用取决于我传不传实参
// :_year(year)//初始值或者表达式
// , _month(month)//每个成员变量只能初始化一次
// , _day(day)
// , _n(1)//const类型的成员变量只能在初始化列表初始化
// , _ref(year)//const和引用成员必须初始化
// , _ptr((int*)malloc(12))
// //对于没有在初始化列表出现的自定义类型成员,编译器会调用他的默认构造,
// // 若是没有默认构造,则会爆错
// {
// if (_ptr == nullptr)
// {
// perror("malloc fail");
// }
// }
//private:
// //声明,缺省值->初始化列表用的
// // 每个构造函数都有初始化列表
// //声明——C++规定声明的顺序也是在内存中存放的顺序
// int _year = 1;
// int _month = 1;
// int _day;
// const int _n;//const只有一次复制的机会,只能在定义的地方初始化
// int& _ref;//引用成员也必须在初始化列表初始化
// int* _ptr;
// //初始化列表->缺省值(不是在构造函数里写的,是在声明这个地方)->内置类型(不确定是否初始化》/自定义类型(调用对应的默认构造)
// //三类必须在初始化列表初始化的:const、没有默认构造的自定义类型、引用
//};
//
//int main()
//{
// //对象定义
// Date d1(2025, 7, 2);//构造函数完成的事情是定义,开空间在调用函数开辟栈帧的时候就已经完成
// d1.Print();
// return 0;
//}
//静态成员变量,一定要在类外进行初始化
//存在静态区,是所有类对象共享
//静态成员函数没有this指针
// 静态成员函数可以访问其他静态成员,但是不能访问替他非静态的,因为没有静态指针
// 非静态的成员函数可以访问任意静态成员
// 突破类域就可以访问静态对象,具体方法有类名::静态成员,或者对象.静态成员
假设已经有A 、 B、 C、 D 四个类,则以下程序构造函数调用的顺序是cabd
// 析构函数调用的顺序是badc——后构造的先析构
//C c
//int main()
//{
// A a;
// B b;
// static D d;所有放在静态区的对象,都是在程序运行到所在位置时才进行初始化
// return 0;
//}
//友元
// 可以是其他类,这样这个类中的成员函数就都可以访问将它视为友元的类的private数据
// 具有单向性和不可传递性
//
//
// 内部类
// 是在一个类里定义的另一个类,是包含它的类的友元,并且受到包含他的类的访问限制(要先访问外面的在访问里面的)
//