static,const和static const 以及它們的初始化
- const 定義的常量在超出其作用域之后,其空間便會(huì)被釋放收回.C++11之后const成員變量可以在類(lèi)內(nèi)定義處初始化,或者通過(guò)構(gòu)造函數(shù)的初始化列表執(zhí)行
- 而static定義的靜態(tài)常量在函數(shù)執(zhí)行之后不會(huì)被釋放其存儲(chǔ)空間.static定義的靜態(tài)成員變量不能在類(lèi)內(nèi)初始化.定義必須在類(lèi)外執(zhí)行 ,且在定義時(shí)前不加static,防止與一般的靜態(tài)變量混淆
class foo
{
public:
foo();
private:
static int i;
};
int foo::i=20;
- static const 與 const static作用一樣,可以直接在類(lèi)內(nèi)定義處直接初始化也可以在類(lèi)外初始化
- static 定義的靜態(tài)成員函數(shù)與靜態(tài)成員變量一樣,都屬于類(lèi)的靜態(tài)成員而不是對(duì)象成員,因此對(duì)靜態(tài)成員的引用不需要類(lèi)定義的對(duì)象名,可以直接通過(guò)::來(lái)引用,其與普通成員函數(shù)的區(qū)別在于其沒(méi)有this指針,而且只能訪(fǎng)問(wèn)靜態(tài)成員變量
//完整例子
#include <iostream>
using namespace std;
class Box
{
public:
static int objectCount;
// 構(gòu)造函數(shù)定義
Box(double a=2.0, double b=2.0, double h=2.0)
{
cout <<"Constructor called." << endl;
length = l;
breadth = b;
height = h;
// 每次創(chuàng)建對(duì)象時(shí)增加 1
objectCount++;
}
double Volume()
{
return length * breadth * height;
}
static int getCount()
{
return objectCount;
}
static const int a = 9; //類(lèi)內(nèi)定義
private:
double length = 2.0; // 長(zhǎng)度
double breadth; // 寬度
double height; // 高度
};
// 初始化類(lèi) Box 的靜態(tài)成員
int Box::objectCount = 0;
int main(void)
{
// 在創(chuàng)建對(duì)象之前輸出對(duì)象的總數(shù)
cout << "Inital Stage Count: " << Box::getCount() << endl;
Box Box1( 1.2, 1.5); // 聲明 box1
Box Box2( 6.0, 2.0); // 聲明 box2
// 在創(chuàng)建對(duì)象之后輸出對(duì)象的總數(shù)
cout << "Final Stage Count: " << Box::getCount() << endl; //并不用對(duì)象引用,輸出為2;
cout << "hhy" << Box1.Volume() << endl;
cout << "hhhy" << Box::a << endl; //輸出為9
return 0;
}
通過(guò)使用靜態(tài)成員變量和靜態(tài)成員函數(shù)使得類(lèi)的所有對(duì)象都能共享,可以有效的節(jié)省內(nèi)存.對(duì)多個(gè)類(lèi)的對(duì)象而言,靜態(tài)數(shù)據(jù)成員只存儲(chǔ)一處.其值是可以更新的,只要對(duì)靜態(tài)數(shù)據(jù)成員的值更新一次,保證所有對(duì)象存取更新后相同的值.