静态变量
堆与栈
1、栈区(stack):有编译器自动分配释放,存放函数的参数值、局部变量的值等,操作凡是类似于数据结构中的栈;
2、堆区(heap):一般有程序员分配和释放(动态存储分配),分配方式类似于链表;
3、全局区(static):全局变量和静态变量的存储,有系统释放;
4、文字常量区:常量字符串存放,系统释放;
5、程序代码区:存放函数体的二进制代码。
堆与栈的区别:
1.栈内存存储的是局部变量而堆内存存储的是实体;
2.栈内存的更新速度要快于堆内存,因为局部变量的生命周期很短;
3.栈内存存放的变量生命周期一旦结束就会被释放,而堆内存存放的实体会被垃圾回收机制不定时的回收。
全局变量静态(static)
1)内存中的位置:静态存储区(静态存储区在整个程序运行期间存在);
2)初始化:未经初始化的静态全局变量会被程序自动初始化为0,普通全局变量未经初始化的值是任意的;
3)作用域:全局静态变量的只在声明它的文件下是可见的(从定义到文件结尾),普通全局变量在整个工程中是可见的。
优点:1)不会被其他文件访问和修改;2)其他文件使用相同的名字的变量不会发生冲突
局部静态变量
1)内存中的位置:静态存储区;
2)初始化:未经初始化的静态局部变量会被程序自动初始化为0,普通局部变量未经初始化的值是任意的;
3)作用域:作用域仍然是局部的,当定义它的函数或语句块结束时,作用域也随之结束。
(static修饰局部变量时,修改了局部变量的存储位置,从原来的占中存储改为静态存储区。但是静态变量离开作用域后并没有被销毁,仍然驻留在内存中,知道程序结束,但是不能对其访问;
Static修饰全局变量时,它改变了全局变量的作用域,只在其声明的文件中可见,存储位置内有改变,仍在静态存储区中)
静态函数
函数的定义和声明默认情况下是extern的,但静态函数只是在声明他的文件当中可见,不能被其他文件所用,
1)静态函数在其他文件中科技定义形同的名字,不会发生冲突;
2)静态函数不能被其他文件所用;
3)静态函数会被自动分配在一个一直使用的存储区,直到退出应用程序实例,避免了调用函数时压栈出栈,速度快很多。
<1>static全局变量与普通的全局变量有什么区别:static全局变量只初使化一次,防止在其他文件单元中被引用;
<2>static局部变量和普通局部变量有什么区别:static局部变量只被初始化一次,下一次依据上一次结果值;
<3>static函数与普通函数有什么区别:static函数在内存中只有一份,普通函数在每个被调用中维持一份拷贝。
C++类中静态变量与静态函数
在类中,静态成员可以实现多个对象之间的数据共享,并且使用静态数据成员还不会破坏隐藏的原则,即保证了安全性。因此,静态成员是类的所有对象中共享的成员,而不是某个对象的成员。使用静态数据成员可以节省内存,因为它是所有对象所公有的,因此,对多个对象来说,静态数据成员只存储一处,供所有对象共用。静态数据成员的值对每个对象都是一样,但它的值是可以更新的。只要对静态数据成员的值更新一次,保证所有对象存取更新后的相同的值,这样可以提高时间效率。
1、静态变量的定义:静态数据成员定义或说明时在前面加关键词static:
2、静态变量初始化:与一般成员初始化不同<数据类型><类名>::<静态数据成员名>=<值>
(1) 初始化在类体外进行,而前面不加static,(这点需要注意)以免与一般静态变量或对象相混淆。
(2) 初始化时不加该成员的访问权限控制符private,public等。
(3) 初始化时使用作用域运算符来标明它所属类,因此,静态数据成员是类的成员,而不是对象的成员。
3、静态数据成员是静态存储的,它是静态生存期,必须对它进行初始化。
4、静态方法不能直接调用一般成员,可以通过对象引用实现调用。
静态成员函数和静态数据成员一样,它们都属于类的静态成员,它们都不是对象成员。因此,对静态成员的引用不需要用对象名。在静态成员函数的实现中不能直接引用类中说明的非静态成员(原因是,非静态成员函数需要传入一个this指针),可以引用类中说明的静态成员(这点非常重要)。如果静态成员函数中要引用非静态成员时,可通过对象来引用。从中可看出,调用静态成员函数使用如下格式:<类名>::<静态成员函数名>(<参数表>);