(一)静态数据成员
静态数据成员是类的所有对象共享的成员,而不是某个对象的成员。
使用静态数据成员可以节省内存,静态数据成员只存储一处,供所有对象使用。静态数据成员相当于类中的“全局变量”(一个对象改变了它的值,例如改变的值为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