初始化列表
构造函数给类的对象初始化时有两种方式:
//构造函数 函数体内初始化成员变量
Date(int year = 1999, int month =1, int day =1)
{
year = _year;
month = _month;
day = _day;
}
//构造函数 初始化列表初始化成员变量
Date(int year = 1999, int month = 1, int day = 1)
:_year(year)
, _month(month)
, _day(day)
{
}
如果类内包含以下成员,必须在初始化列表中进行初始化:
- 引用成员变量
- const成员变量
- 自定义类型成员(该类没有默认构造函数)//默认构造函数指的不需要传参可以直接调用的构造函数
对比以下两种初始化方式:
总结
内置类型:使用初始化列表或者函数体内初始化,都可以。
自定义类型:建议使用初始化列表。
static成员
声明为static
的类成员是类的静态成员,用static
修饰的成员变量,叫做静态成员变量;用static
修饰的成员函数,称为静态成员函数。静态成员变量一定要在类外进行初始化。
面试题:计算程序中创建对象的个数
class A
{
public:
A()
{
++_count;
}
A(const A& a)
{
++_count;
}
static int GetCount()
{
return _count;
}
private:
static int _count; //声明
};
int A::_count = 0; //定义初始化
特性:
1. 静态成员为所有类对象所共享,不属于某个具体的实例
2. 静态成员变量必须在类外定义,定义时不添加static关键字
3. 类静态成员即可用类名::静态成员或者对象.静态成员来访问
4. 静态成员函数没有隐藏的this指针,不能访问任何非静态成员
5. 静态成员和类的普通成员一样,也有public、protected、private3种访问级别,也可以具有返回值
附加两道OJ编程题:
有两个日期,求两个日期之间的天数,如果两个日期是连续的我们规定他们之间的天数为两天
#include<iostream>
#include<math.h>
using namespace std;
//判断是否是闰年
bool is_leap(int year)
{
if((year%4==0 && year%100!=0) || (year%400==0))
return true;
return false;
}
//计算日期距离0-0-0的天数
int cal_days(int year,int month,int day)
{
int daytab[2][13]={
{0,31,28,31,30,31,30,31,31,30,31,30,31},
{0,31,29,31,30,31,30,31,31,30,31,30,31}};
int t_year=0;
int days=0;
while(t_year<year)
{
if(is_leap(t_year))
days+=366;
else
days+=365;
++t_year;
}
int t_month=1;
int falg=0;
while(t_month<month)
{
if((year%4==0 && year%100!=0) || (year%400==0))
falg=1;
days+=daytab[falg][t_month];
++t_month;
}
return days+=day;
}
int main()
{
int y1, y2;
int m1,m2;
int d1,d2;
while(scanf("%04d%02d%02d", &y1, &m1, &d1)!=EOF){
scanf("%04d%02d%02d", &y2, &m2, &d2);
int n1=cal_days(y1,m1,d1);
int n2=cal_days(y2,m2,d2);
cout<<abs(n1-n2)+1<<endl;
}
return 0;
}
#include<iostream>
using namespace std;
int main()
{
int arr[13]={0,31,28,31,30,31,30,31,31,30,31,30,31};
int year;
int days;
int month;
while(cin>>year>>days)
{
int month=1;
if((year%4==0 && year%100!=0) || (year%400==0))
{
arr[2]=29;
}
while(days>arr[month])
{
days-=arr[month];
++month;
}
printf("%04d-%02d-%02d\n",year,month,days);
}
return 0;
}