首页 > 代码库 > 静态成员

静态成员

静态成员变量的初始化一定要在类外原因:

    因为静态成员变量本身在main函数未开始时已经存在。不要让成员变量的初始化依赖于对象。不用对象,难到就不能用这一变量了吗?

如果将初始化放在类内。那么当不声明对象时,无法使用这一静态变量。编译器报错为‘undeclared identifier’。



#include<iostream>

using namespace std;

class B{

public:

static void Add(){i++;}

//静态成员函数只可以使用静态成员变量,因为静态成员函数没有this指针,所有对象共享使用这一

//成员函数所以无法使用非静态成员变量。因为每个非静态成员变量在各个对象中都不同。

static int i;//静态成员变量在类内声明:

void out(){cout<<"static i="<<i<<endl;}

};

int B::i=0;//静态成员变量一定要在类外初始化

class D:private B{

public:

void f(){

i=5;

        Add();

B::i++;//这里静态变量也可以直接用i++;

B::Add();

}

};

int main(){

B x;

D y;

x.Add();

x.out();

y.f();

cout<<"static i="<<B::i<<endl;//1.静态成员变量的调用可直接用 “类名::变量名”

cout<<"static i="<<x.i<<endl;//2.也可用用对象名直接调用

//cout<<"D中i的值:"<<y.i<<endl;//这是错误的,因为在y中i的访问权限是私有的所有无法用对

//象访问。

return 0;

}



static 的作用:

一、static 在代码块内声明局部变量,作用域为代码块内。

其static的作用是声明为静态可持续变量,在程序中一直存在。

二、static 在代码块外声明局部变量时,作用域为声明处直到文件结尾。

其static的作用是声明为内部链接性,即不可以被程序的外部文件调用。起到隐藏作用

注意未加static的全局变量和函数可以被外部程序访问!

int j;//static duration,external linkage 可以被程序的外部文件使用。

static int k;//static duration ,internal linkage,作用在以下所有程序,且只可以本文件使

//用。

void test(){

static int i;//static duration nolinage;只作用于代码块内。静态局部变量

i=5;

cout<<"static i="<<i<<endl;

}

int main(){

//cout<<i<<endl;错误的

test();

cout<<j<<endl;//static和全局变量都是默认为0!

}

PS:全局变量和static修饰的变量都存储在静态存储区。

静态成员