(一)静态数据成员 函数
静态数据成员是类的全部对象共享的成员,而不是某个对象的成员。 this
使用静态数据成员能够节省内存,静态数据成员只存储一处,供全部对象使用。静态数据成员至关于类中的“全局变量”(一个对象改变了它的值,例如改变的值为a,那么其余对象看到它的值为都为a)。 spa
使用静态成员的方法和注意事项: 指针
一、 静态数据成员在定义或说明是前面加上关键字“static” 对象
eg: private: 内存
int a; get
static int staticVariable;//定义了一个静态变量 class
二、静态成员的初始化 变量
(1)初始化在类体外进行,前面不加static,以避免与通常静态变量或对象相混淆。 权限
(2)初始化时使用做用于运算符(::)来标明他所属的类(这也说明了静态数据成员是属于类的,而不是属于某个对象的。)
eg: class A {
private:
int a ;
public:
static int staticVariable;
};
int A::staticVariable = 0; //在类外进行初始化,并加上做用于运算符(::)
注意:静态数据成员存放在静态存储区,必须对它进行初始化。
三、引用静态成员的格式
若是静态成员的访问权限是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 staticVarible;
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