类中的静态成员(static)

  • Post author:
  • Post category:其他



(一)静态数据成员


静态数据成员是类的所有对象共享的成员,而不是某个对象的成员。


使用静态数据成员可以节省内存,静态数据成员只存储一处,供所有对象使用。静态数据成员相当于类中的“全局变量”(一个对象改变了它的值,例如改变的值为a,那么其他对象看到它的值为都为a)。




使用静态成员的方法和注意事项:



1、 静态数据成员在定义或说明是前面加上关键字“


static





eg: private:


int  a;



static int staticVariable;


//定义了一个静态变量


2、静态成员的初始化


(1)初始化在类体外进行,前面不加static,以免与一般静态变量或对象相混淆。


(2)初始化时使用作用于运算符




::




来标明他所属的类(这也说明了

静态数据成员是属于类的,而不是属于某个对象的

。)


eg:    class A {


private:


int a ;


public:


static int staticVariable;


};


int A::staticVariable = 0;

//在类外进行初始化,并加上作用于运算符(::)


注意:静态数据成员存放在静态存储区,必须对它进行初始化。


3、引用静态成员的格式


如果静态成员的访问权限是public,则可以用


<类名> ::<静态成员名>的格式来访问


eg:A ::staticVariable = 10;




举一个例子:


class Number{


private:


int a,b;


static int staticVarible;




public:


void getVariable(){


cout << a << “,” << b <<“,” << staticVarible << endl;


}



void getStaticVarible(){




cout << staticVarible << endl;




}


Number (int a , int b , int c){



this->a = a;


//当参数的名字与类中变量名相同时,用this指针加以区分


this->b = b;


this->staticVarible = c;


}




};




int Number :: staticVarible = 3;// 类外初始化静态数据成员




void main(){



Number M(3,7,1);


M.getVariable();



Number N(10,8,11);


N.getVariable();



M.getStaticVarible();


N.getStaticVarible();



}


输出结果:



3,7,1



10,8,11



11



11







结果表明了在初始化了




N




以后,




M




中的



StaticVarible的值变成了11,说明了

静态数据成员是多个对象共享的。





(二)静态成员函数:


静态成员函数与静态成员一样,都

属于类

,而

不属于某个对象

。因此,

对静态成员的引用可以用类名



注意:

静态成员函数的实现中可以直接引用类中说明的静态成员,不可以直接引用类中说明的非静态成员

(为什么不能引用呢?因为非静态成员只能通过对象来调用,而不能通过类来调用,意味着在没有对象存在时,非静态成员是不分配内存的,如果静态成员函数用了非静态成员那么将产生错误)。

静态成员函数如果要引用非静态成员时,可以通过对象来访问。


举一个例子:


class Number{




private:


int a,b;


static int staticV


arible;



public:




Number (int a , int b , int c){




this->a = a;


this->b = b;


this->staticVarible = c;



}


int getStaticVarible(){




return staticVarible;


}



//静态成员函数可以在类内定义也可以在类外定义


static void printStaticVarible(){


cout << staticVarible;



};


static void printVaribles(Number f);




};



int Number :: staticVarible = 3;




void Number::printVaribles(Number f){


/*—-这里用 f 可以调用类中的私有成员,是因为 printVaribles(Number f) 是类函数的缘故—-*/




f.printA();


//只能用对象来访问非静态成员函数


cout << “b = ” << f.b << endl;


//只能用对象类访问非静态数据成员


cout << “staticVarible = ” << staticVarible << endl ;

//可以直接访问静态数据成员






printStaticVarible();

//可以直接访问静态成员函数


}


void main(){




Number M(3,7,1);


Number N(10,8,11);



/*————两种方式调用静态成员函数—————–*/


M.printVaribles(M);//通过对象调用


Number::printVaribles(N);//通过类名来调用


}




输出结果:







a = 3





b = 7



staticVarible = 11



静态成员函数




staticVarible = 11



a = 10



b = 8



staticVarible = 11



静态成员函数




staticVarible = 11





转载于:https://my.oschina.net/u/1245365/blog/178325