用static修饰的成员变量,称之为静态成员变量,用static修饰的成员函数,称之为静态成员函数。
面试题:实现一个类,计算程序中创建了多少个类对象
class Count
{
public:
Count()
{
++_count;
}
Count(const Count& C)
{
++_count;
}
static int GetCount()
{
return _count;
}
private:
static int _count;
};
int _count = 0;
static特性:
- 静态成员为类对象所共享,不属于某个具体的实例
- static修饰的成员函数可以通过类名::静态成员或者对象.静态成员
- 静态成员必须在类外定义,定义时不加static关键字
- 静态成员函数没有隐藏的this指针,不能访问任何非静态成员
- 静态成员和类的普通成员一样,也有public,protected,private三种访问级别,也可以具有返回值,const修饰符等参数
两个问题:
1.静态成员函数可以调用非静态成员函数吗?
在特殊情况下可以通过在静态成员函数参数列表中传递类的地址来实现对类对象的非静态成员变量进行访问和操作,如下:
class Date
{
public:
Date(int year = 2019,int month = 1,int day = 1)
:_year(year)
,_month(month)
,_day(day)
{}
static void Print(Date* d)
{
d->Add();
}
void Add()
{
_year++;
_month++;
_day++;
}
friend ostream& operator<<(ostream&,const Date&);
private:
int _year;
int _month;
int _day;
};
ostream& operator<<(ostream& os,const Date& d)
{
os << d._year<<" " <<d._month <<' '<<d._day;
return os;
}
int main()
{
Date d;
d.Print(&d);
return 0;
}
2.非静态成员函数可以调用静态成员函数吗?
也可以,可以直接调用。