Static
很多公司会喜欢问static的作用是什么,如果不考虑在类当中的应用,其主要作用有以下三点:
1)隐藏
加了static的全局变量,在其他源文件中就“看不见”了。也就是说,加了static,可以用来解决不同文件里定义了同名的函数或者变量。
2)默认初始化为0
对于未初始化的全局变量和静态变量,都是存储在同一块区域——BSS段。在BSS段中,所有字节的默认值为0X00,这样就减少了我们初始化的工作量。
3)保持局部变量内容
这一点也是大家都知道的特性,static变量会静态保存值,于是可以用于计数。
那么在类中,Static 又发挥着什么样的作用呢?
在类中,所有对象是共享static变量的,它是被存储在全局(静态)存储区里的,也就是说我们在计算某个类所占内存大小的时候,static变量是不用考虑的,这也是很多公司喜欢考察的地方。也由于同一类的对象共享static变量,对于static变量的初始化,我们需要在类外进行。这是为什么呢?
试想,若static变量在类内初始化,对于对象中的static变量值,就会出现不一致的情况。这显然是与“所有对象共享static变量”相违背的。定义的方法很简单,如下:
class B{//class与struct的区别:class的默认访问是Private,而struct的默认访问是public
public:
static int a;//static变量在类内声明
};
int B::a=2;//<strong>类外不要添加static关键字,添加则编译不通过</strong>
说到static成员变量就会想到const成员变量,这两者又有什么不同呢?
Const
提到const首先想到的是常量的概念,即一旦定义初始化了,就不能修改。没错,于是在C++所有的const变量在定义时必须初始化,不然就不是常量啦。
与static有一点相似的是,const定义全局变量的时候,这个变量值在这个文件里可见,而不能被其他文件所访问。如果想整个程序都能访问,那就要加上extern。
那么在类中Const又与Static有什么不同的呢?
在类中,每一个对象有自己的const,在每个对象里const变量的值是常量。根据这个规定,const成员变量的声明在类内,但是初始化必须在构造函数里。为什么呢?理由也很简单,const成员变量虽然是常量,但是每一个对象的const变量值可以是不同的,于是放在构造函数中初始化也是为了保证每个对象可以自由个const变量初始化。定义如下:
<pre name="code" class="cpp">class B{
public:
const int b;
B():b(9){}//在构造函数中,冒号和函数体之间的部分即为初始化列表,初始化顺序是按照类里声明的顺序
};
有一个例外尤其注意: static const 类型的变量如果是char、int\、long、short,则可以在类的定义体中进行初始化的,static const变量是整个类中都恒定的常量,与const static相同(const int * a 与int const * a 表达的意思也相同),否则也需要在类外初始化,初始化时static修饰符不能加,需要加const.