我们可以使用 static 关键字来把类成员定义为静态的。当我们声明类的成员为静态时,这意味着无论创建多少个类的对象,静态成员都只有一个副本。静态成员在类的所有对象中是共享的。
先上代码,如何声明,定义静态变量,使用
// ************** XXXX.h begin
#include <iostream>
using namespace std;
class Box
{
public:
//静态变量
static int objectCount;
// 构造函数定义。重点是静态变量的使用,函数的定义不应该写在.h里,大家不要这样写
Box(double l=2.0, double b=2.0, double h=2.0)
{
cout <<"Constructor called." << endl;
length = l;
breadth = b;
height = h;
// 每次创建对象时增加 1
objectCount++;
}
double Volume()
{
return length * breadth * height;
}
static int getCount()
{
return objectCount;
}
private:
double length; // 长度
double breadth; // 宽度
double height; // 高度
};
// ************** XXXX.h end
// ************** XXXX.cpp begin
// 初始化类 Box 的静态成员
int Box::objectCount = 0;
.....
// ************** XXXX.cpp end
int main(void)
{
// 在创建对象之前输出对象的总数
cout << "Inital Stage Count: " << Box::getCount() << endl;
Box Box1(3.3, 1.2, 1.5); // 声明 box1
Box Box2(8.5, 6.0, 2.0); // 声明 box2
// 在创建对象之后输出对象的总数
cout << "Final Stage Count: " << Box::getCount() << endl;
cout << "Final Stage Count: " << Box::objectCount << endl;
return 0;
}
静态变量的声明放在.h,定义放在.cpp文件
静态成员变量在类中仅仅是声明,没有定义,之所以要在类的外面定义,实际上是给静态成员变量分配内存。如果不加定义就会报错,初始化是赋一个初始值,而定义是分配内存。
1、静态数据成员的声明,在前面加关键字static。
static int objectCount;
2、静态成员的定义和初始化,格式如下:
<数据类型><类名>::<静态数据成员名>=<值> //静态变量的初始化
int Box::objectCount = 0;
int Box::objectCount ; //只定义不初始化
注意:定义放在.cpp文件。
3、使用
(1)类内的使用方法和普通全局变量一样
(2)类外
<类名>::<静态成员名> ;
4、静态成员函数
如果把函数成员声明为静态的,就可以把函数与类的任何特定对象独立开来。静态成员函数即使在类对象不存在的情况下也能被调用,静态函数只要使用类名加范围解析运算符 :: 就可以访问。
静态成员函数只能访问静态成员数据、其他静态成员函数和类外部的其他函数。
具体请看:http://www.runoob.com/cplusplus/cpp-static-members.html
总结:静态成员变量和静态函数和java一样,只是静态成员变量的定义和初始化要放在cpp中
还有c++类中的全局变量的初始化,无论是静态还是普通都不要在类中进行初始化。
参考文章2:
https://www.cnblogs.com/ppgeneve/p/5091794.html