static关键字的作用说明

就目前,本人掌握的信息来看,static关键字的作用有俩,其一是在分离式编译环境下避免不同源文件中定义的全局变量使用相同的名字引发的命名冲突(有点绕脑),其二,有关类的静态成员定义说明。

i、对第一点进行说明,static修饰符能够减少类命名冲突。

static int a; 注意此处把a看作是全局变量。(使用static修饰的局部变量不会随函数结束而释放地址空间!)

通过static关健字,把a的作用域限制在一个源文件中,对于其他源文件,a是不可见的。因此,如果若干个函数需要共享一组外部对象,可以将这些函数放到一个源文件中,把它们需要用到的对象也都在同一个源文件中以static修饰符声明。

static修饰符不仅适用于变量,也适用于函数。如果函数f需要调用另一个函数g,而且只有函数f需要调用g,可以把函数f与函数g都放到同一个源文件中,并且声明函数g为static。于是将函数g限制在该源文件作用域中,且只能被此源文件中的函数调用。换言之,在别的源文件是也可以定义相同的函数名,在别的源文件中调用相同函数名g,不会引发名字冲突。

static int g(int x){
    /* g函数体*/
}

void f(){
    /* 其他内容*/
    b=g(a);
}

针对函数使用static修饰符而言,如果一个函数仅仅被同一个源文件中的其他函数调用,就应该声明该函数为static;

ii、有关类的静态成员定义说明(static)

有时需要为某个类的所有对象分配一个单一(共享)的存储空间。使用static修饰数据成员,于是将该数据当成全局变量那样去存储,但又被隐藏在内部,而且清楚地与这个类相联系。

精髓的一句话:类的静态成员拥有一块单独(共享)的存储区,而不管创建了多少个该类的对象。所有这些对象的静态数据成员都共享这一块静态存储空间,于是就为这些对象提供了一种互相通信的方法。

静态成员属于类,且只在类的范围内有效(可通过类的对象成员或引入类的作用域使用该静态成员)。

类的静态成员,在类内进行声明,而类外进行定义且只定义一次。如下举例:

xxx.h类型文件中
class base{
pubilc:
    static int var;//声明静态数据成员
}

xxx.cpp类型文件中
int base::var=10;//定义静态数据成员,不用再用static修饰符

C++静态数据成员被类的所有对象所共享,包括该类的派生类的对象。派生类对象与基类对象共享基类的静态数据成员。静态的数据成员在内存中只占一份空间。如果改变它的值,则在各个对象中这个数据成员的值同时都改变了。

iii、有关静态成员函数

和静态数据成员函数一样,静态成员函数也是类的一部分,而不是对象的一部分。如需调用,方式如Box::volume();形式。

在C++中,静态成员函数的作用不是为了对象之间的沟通,而是为了能处理静态数据成员。

静态成员函数与非静态成员函数的根本区别:非静态成员函数有this指针,而静态成员函数没有this指针。由此决定了静态成员函数默认(通过this指针)访问本类中的非静态成员是非法行为

猜你喜欢

转载自blog.csdn.net/TT_love9527/article/details/81537466