一、定义静态成员变量
·关键字 static 可以用于声明一个类的成员,静态成员提供了一个同类对象的共享机制
·把一个类的成员声明为static时,这个类无论有多少个对象被创建,这些对象共享这个static成员
·静态成员变量不是类或者对象的成员变量,但是他的作用域是在类和类的所有的实例化对象
class cat
{
public:
char name[4];
int age;
cat()
{
cout<<"cat()"<<endl;
cnt++;
}
~cat()
{
cout<<"~cat()"<<endl;
cnt--;
}
static int cnt ;//只是声明一个静态成员变量,不是类或者对象的成员变量,但是他的作用域是在类和类的所有的实例化对象
};
int cat::cnt =0;//定义了cat这个类中的静态成员变量cnt,并且初始化为0(如果不初始化默认为0)
int main()
{
cout<<sizeof(cat)<<endl;//大小为8,static int cnt不是类或者对象的成员变量
cat *p = new cat[4];
cout<<cat::cnt<<endl;//4
cat s1;
cout<<cat::cnt<<endl;//5
cat s2;
cout<<cat::cnt<<endl;//6
return 0;
}
二、类的静态成员函数
1、使用static修饰的成员函数叫做静态成员函数
2、在静态成员函数内不能够访问除静态成员变量以外的其他成员变量
3、静态成员函数的调用:
A、对象.静态成员函数()
B、类名::静态成员函数()*建议使用类访问静态成员变量和成员函数,因为这种方式可读性强*
class cat
{
public:
char name[4];
int age;
cat()
{
cout<<"cat()"<<endl;
cnt++;
}
~cat()
{
cout<<"~cat()"<<endl;
cnt--;
}
//静态的成员函数
static int cat_num() //没有this指针,不能访问非静态成员变量
{
return cnt;//访问静态成员变量
}
static int cnt ;//只是声明一个静态成员变量,不是类或者对象的成员变量,但是他的作用域是在类和类的所有的实例化对象
};
int cat::cnt =0;//定义了cat这个类中的静态成员变量cnt,并且初始化为0(如果不初始化默认为0)
int main()
{
cout<<sizeof(cat)<<endl;//大小为8,static int cnt不是类或者对象的成员变量
cat *p = new cat[4];
cat s1;
cat s2;
cout<<cat::cnt<<endl;//6
cout<<s1.cat_num()<<endl;//6
cout<<cat::cat_num()<<endl;//6,建议使用类访问静态成员变量和成员函数,因为这种方式可读性强
return 0;
}
4、为什么静态的成员函数不能够访问对象/类的成员变量?
因为静态成员函数不属于对象!!
5、什么时候可以将函数设计成静态成员函数?
函数的行为跟类的实例无关,只跟类有关
静态成员函数的用处:
·访问被private/protected 修饰静态成员变量
·可以实现某些特殊的设计模式:如Singleton(单例模式)
·可以封装某些算法,如何数学函数,如ln,sin,tan等等,这些函数本就没必要属于任何一个对象,所有从类的调用感觉更好,如何定义一个数学函数类Math,调用Math::sin(3.14);如果非要用非静态函数,那就必须:Math math;math.sin(3.14);可以是可以,就是为了一个根本无状态存储可言的数学还要引入一次对象的构造和一次对象的析构,显然不好。