静态成员变量
静态成员变量是类变量,被所有类成员共享
静态数据成员:static修饰的数据成员不属于对象空间,构造函数不对它初始化
私有静态数据成员
私有静态数据成员定义
(私有的或保护的静态成员必须通过公有接口进行访问) <一般将公有接口定义为静态成员函数>
int Hero::getDougsEnergy()
{
//m_energy = 200; //在静态成员函数中操作非静态数据是非法的
return dougEnergy;
}
公有静态数据成员
公有静态数据成员定义
静态成员初始化
静态成员初始化在类体外进行
初始化时使用作用域运算符表明它所属的类;
初始化在类体外进行,前面不要加static,以免于一般静态变量和对象混淆;
初始化时不加该成员的访问控制符<如private>(静态数据成员初始化位置与访问权限无关);
int Hero::dougEnergy = 100;
int Hero::dougPlus = 500;
静态成员变量使用前必须先初始化(如int MyClass::m_nNumber=0 ) 否则会在linker时出错。
静态成员函数
作用:操作私有的静态数据成员
在静态成员函数中不能直接引用类中说明的非静态数据成员,可以引用类中说明的静态成员
(静态成员不接受this指针)
非静态成员函数中可以调用静态成员。因为静态成员属于类本身,在类的对象产生之前就已经存在了,所以在非静态成员函数中是可以调用静态成员的。
用例源码
#include <iostream>
#include <string>
using namespace std;
class Hero
{
public:
static int dougPlus;
static int getDougsEnergy();
//一个英雄有名字、身高、体重、活力
//多个英雄打一个豆豆
Hero(const char *name, int height, int weight, int energy = 100);
//~Hero();
void ganfan();
void sleep();
void daDouDou();
int getEnergy();
private:
static int dougEnergy; //有一个共享数据 叫豆豆的活力值 //私有的静态数据成员
string m_name;
string m_birthDate;
int m_height;
int m_weight;
int m_energy;
};
Hero::Hero(const char *name, int height, int weight, int energy)
{
m_name = name;
m_height = height;
m_weight = weight;
m_energy = energy;
}
void Hero::ganfan()
{
m_energy += 20;
}
void Hero::sleep()
{
m_energy += 40;
}
void Hero::daDouDou()
{
if(m_energy)
{
m_energy -= 30;
dougEnergy -= 50;
dougPlus -= 50;
}else
{
printf("您已没有能量\n");
}
}
int Hero::getDougsEnergy()
{
//m_energy = 200; //在静态成员函数中操作非静态数据是非法的
return dougEnergy;
}
int Hero::getEnergy()
{
return m_energy;
}
int Hero::dougEnergy = 100;
int Hero::dougPlus = 500;
int main()
{
Hero Me("ABin", 175, 65, 200);
Hero You("lala", 170, 50, 300);
while(Me.getDougsEnergy())
{
Me.daDouDou();
cout << "我看见的豆豆的能量" << Me.getDougsEnergy() << endl;
cout << "你看见的豆豆的能量" << You.getDougsEnergy() << endl;
}
cout << "你看见的豆豆的能量" << You.getDougsEnergy() << endl;
while(You.getEnergy()) //只要你有劲你就打大豆豆
{
You.daDouDou();
cout << "大豆豆的能量" << Hero::dougPlus << endl;
}
return 0;
}