C++中的static深度剖析

来源:互联网 发布:关系数据库是什么 编辑:程序博客网 时间:2024/06/18 11:47

C++中的static

static的作用
在C语言中,static的作用有两个:
一是使得static声明的变量只能在当前文件中被访问,即当其他的文件中想通过像使用全局变量一样(如:extern int i;)使用static声明的变量时,就会在link的时候出错。其功能就相当于使得该文件中static声明的变量隐藏于该文件中而不被其他文件所发现。
其第二个作用是使得static声明的变量持久,即如果在一个函数中声明的一个static的变量,那么这个变量就会作为全局变量使用,即便是在退出该函数之后(程序未结束),该static变量任然存在。
在C++中static的作用:
在c++中,static就只是起到了持久(persistent)的作用,因为隐藏的作用是通过类来实现的。
在C++中,类的成员和函数都可以声明为static的。但是用法上有如下的一些规则:
a. static的成员变量在初始化时,只能通过definition来初始化,不能通过initialize list来初始化。原因是在C++中,class是一个声明而非一个定义,其定义需要另外进行,所以static的成员变量在class中还只是一个声明,只有在定义时,才能被声明,在initialize list的时候其是不存在的,只有在initialize list过了该变量才能说是被定义了。
b. 除了在class中需要声明static的变量外,还需要在相应的.cpp文件里定义该变量,如果class A 中有static int i,则必须在.cpp中有int A::i;这就是A中static的成员变量的定义,如果没有这样的定义,static的变量是不允许被使用的。
c. static的成员函数只允许访问static的成员变量而不允许访问其他的成员变量,原因是static的东西是属于类的,而该类的某个对象,如果允许static的函数访问成员变量的话,那么当对象没有被创建时,非static的成员变量是不存在的,会访问出错。归根究底,由于每个对象都会有一个this指针隐式地传入其成员函数中,但是static地成员函数可以在对象创建之前就对static地变量进行访问,这时没有this指针,所以不能访问非static地成员变量。
d. 在对static的变量和成员函数进行访问时,如果都是public的话,可以直接使用A::i或A::fun()来进行访问,但是只要不是public,则不能这样访问,只能通过相应的公有static函数来进行访问。

原创粉丝点击