c/c++中static用法
c中static用法
回想一下,c中static用法:
1.局部变量和static局部变量
作用域:相同,都是所定义的函数;
生存周期:不同,分别是所定义的函数执行结束,程序运行结束;
存储空间:不同,分别是栈和静态存储区;
2.全局变量和static全局变量
作用域:不同,分别是所有文件的函数使用和所定义的源文件中函数调用;
定义static全局变量:避免其他文件中同名变量冲突,起到隐藏作用;
生存周期:相同,程序运行结束;
存储空间:相同,静态存储区;
3.普通函数和static函数
作用域:不同,分别是全局可访问,static函数限制只能是所定义的源文件中函数调用;
c/c++存储区有4种或5种说法:
(1)堆区、栈区、静态存储区、常量存储区
(2)堆区、栈区、自由存储区、静态存储区、常量存储区;
c++中static用法
首先,为什么要引入static?
为什么要引入static数据成员?
当一个数据成员属于整个类而不是一个对象,又不能破坏类的封装,即要求在类的内部,对外不可见。所以,引入static数据成员。例如,C++ Primer关于静态成员例子,一个银行账户类需要一个数据成员来表示当前的利率。在这个类中,我们希望的是利率与类相关联,而不是与类的每个对象相关联。
再来谈为什么引入static成员函数?
C++中调用类的成员函数,会传递this指针,将类的实例化对象的首地址传递给成员函数,根据对象首地址计算其成员变量,然后进行操作。然而,static变量不在对象的内存空间中,因而没有必要用到this指针,所以需要独立于对象之外的对static变量访问的方式。早期是((ClassName *)0)->func(),这样避免了对象的实例化操作,后来干脆引入static成员函数。
用法: static数据成员必须在类外初始化。
class Test
{
public:
....
static void show()
{ cout << count <<endl; }
private:
...
static int count; //这里只声明,没有分配内存,没有初始化。
}
int Test::count = 0; // 必须类外初始化静态变量
int main()
{
Test a(4);
a.show(); //也可以a.show();
}