赞
踩
在函数体内,静态变量具有“记忆”功能,即一个被声明为静态的变量只会被初始化一次,然后在这一函数被调用的过程中其值维持不变
在文件内(但在函数体外),用来限制变量或函数的作用域为当前文件,即如果一个变量被声明为静态的,那么该变量可以被当前文件内所有函数访问,但不能被其他文件中的函数访问。它是一个本地的全局变量,且只会被初始化一次。
如果一个函数被声明为静态的,那么该函数与普通函数作用域不同,其作用域仅在本文件中,它只可被当前文件内的其他函数调用,不能被其他文件的函数调用。也就是说,这个函数被限制在仅能被声明它的文件内使用。
对于C++,除了C语言中的功能外,在类内的数据成员也可以被定义为static,在这种情况下,该数据成员就是类的静态数据成员,静态数据成员有以下特点:
对于非静态数据成员,每个对象都有自己单独的一个副本。而静态数据成员被当作是类的成员,只会存在唯一的副本,且被所有对象共享。
静态成员变量属于类而不属于对象。也就是说,即使没有实例化的对象,也可以使用静态变量,通常通过“类名::静态成员变量”来访问。
静态数据成员和普通数据成员一样遵从public、protected、private访问规则
static成员变量的初始化是在类外,初始化的时候不需要再使用static关键字。被private或protected修饰的static成员虽然可以在类外初始化,但是不能在类外被访问。
在类中,被static修饰的函数是类的静态成员函数,静态成员函数也属于类,而不属于某一个特定对象,被所有对象共享。因此,它没有this指针。从这个意义上讲,类的静态成员函数无法访问对象成员,也无法访问普通成员函数,它只能访问静态成员函数或静态成员变量。
与全局变量相比,使用静态数据成员有以下两个优势:
全局变量的作用范围是整个工程,而static变量的作用范围仅仅是这个变量所在的文件。static变量与全局变量相比,减少了命名冲突的可能性。可以在不同文件中定义名称相同的static变量,但是不能定义名字相同的全局变量。
可以实现信息隐藏。静态数据成员可以是private成员,而全局变量不能。
类的静态成员必须初始化,而且必须在类外初始化。类中的静态成员变量仅仅是声明,而变量被声明的时候不分配内存空间,只有在定义的时候才分配空间,变量的声明可以理解为一个承诺,它承诺这个变量将会在某个地方被定义。
由于类的声明可能会被多个地方引用,如果把静态变量的初始化放在类内,每次引用都会初始化一次(分配一次空间),这与静态变量只能初始化一次且只存在一个副本相冲突,因此静态变量只能在类外初始化。
对于所有对象(不仅仅是静态对象),初始化都只有一次,而由于静态变量具有记忆功能,初始化后,一直都没有被销毁,都会保存在内存区域中,所以不会在此初始化。
存放在静态区的变量的生命周期一般都比较长,在程序结束后被释放,所以它只需初始化一次。而auto变量,即自动变量,由于它存放在栈区,一旦函数调用结束,就会立刻被销毁。
不可行,如果在头文件中定义静态变量,会造成资源浪费,同时也可能引起程序错误。因为如果在使用了该头文件的每个C语言文件中定义静态变量,按照编译的步骤,在每个头文件中都会单独存在一个静态变量,从而引起空间浪费或程序错误。
所以,不推荐在头文件中定义任何变量。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。