static,const和static const 以及它们的初始化
- const 定义的常量在超出其作用域之后,其空间便会被释放收回.C++11之后const成员变量可以在类内定义处初始化,或者通过构造函数的初始化列表执行
- 而static定义的静态常量在函数执行之后不会被释放其存储空间.static定义的静态成员变量不能在类内初始化.定义必须在类外执行 ,且在定义时前不加static,防止与一般的静态变量混淆
class foo
{
public:
foo();
private:
static int i;
};
int foo::i=20;
- static const 与 const static作用一样,可以直接在类内定义处直接初始化也可以在类外初始化
- static 定义的静态成员函数与静态成员变量一样,都属于类的静态成员而不是对象成员,因此对静态成员的引用不需要类定义的对象名,可以直接通过::来引用,其与普通成员函数的区别在于其没有this指针,而且只能访问静态成员变量
//完整例子
#include <iostream>
using namespace std;
class Box
{
public:
static int objectCount;
// 构造函数定义
Box(double a=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;
}
static const int a = 9; //类内定义
private:
double length = 2.0; // 长度
double breadth; // 宽度
double height; // 高度
};
// 初始化类 Box 的静态成员
int Box::objectCount = 0;
int main(void)
{
// 在创建对象之前输出对象的总数
cout << "Inital Stage Count: " << Box::getCount() << endl;
Box Box1( 1.2, 1.5); // 声明 box1
Box Box2( 6.0, 2.0); // 声明 box2
// 在创建对象之后输出对象的总数
cout << "Final Stage Count: " << Box::getCount() << endl; //并不用对象引用,输出为2;
cout << "hhy" << Box1.Volume() << endl;
cout << "hhhy" << Box::a << endl; //输出为9
return 0;
}
通过使用静态成员变量和静态成员函数使得类的所有对象都能共享,可以有效的节省内存.对多个类的对象而言,静态数据成员只存储一处.其值是可以更新的,只要对静态数据成员的值更新一次,保证所有对象存取更新后相同的值.