在考试中,由于经常看到一个静态变量定义在一个函数中,然后多次调用这个函数通过考察多次调用的时候这个变量的值来考察静态变量,这样的考察方式先入为主的奠定了自己对于静态变量的印象。(实际上这仅仅是静态变量中比较特殊的一类,我们称为局部静态变量)而且自己有的时候有一个不好的习惯就是将类写在main函数中。然后自己在写一个类的时候就出现了报错现象。代码如下:
#include<iostream>
using namespace std;
int main(){ //将类定义在了main函数之中,这样真的对吗
struct a{
static int num;
};
int a::num=0;//首先,类中非只读的静态对象只能在类外进行初始化(或者说定义,因为静态对象不是属于某一个单独的对象的,因此不能写在构造函数中,因而放在类外进行初始化),而且前面不能加static(这一条是规定)
a a1;
cout<<a1.num<<endl;
return 0;
}
我们先来说明一下在main函数中写类的坏处。首先最明显的一点就是函数不能嵌套定义,那么如果我们要在类外定义类中的成员函数的时候就是不合法的,当然我们可以在类中声明函数的时候将函数写出来,但是在多数情况下我们经常是仅仅在类中进行声明,而不进行定义的。
所以,尽量不要将类定义在main函数中。
我们继续回到类中的静态成员中,对于类中的静态数据成员,C++primer有一句话,类中的静态数据成员定义在任何函数之外,注意是类中的数据成员而不是类中的成员函数,对于类中的成员函数而言,既可以定义在类外,但是定义在类外的时候是不能加static关键字的,这是规定。
再看上面的代码,我们规定类中的静态数据成员是作用域全局的,因此是必须在全局进行初始化的,而我们不可能仅仅将成员变量丢到全局,而在函数中定义整个类的,所以对于含有静态数据成员的类而言,是没有任何选择,必须定义在全局的。