c/c++ static用法

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();
}

参考

[1] https://blog.csdn.net/artechtor/article/details/2312766

猜你喜欢

转载自blog.csdn.net/zxc995293774/article/details/79980632
今日推荐