c++ static的用法总结

参考链接:https://blog.csdn.net/mznewfacer/article/details/6898005

static的作用主要有以下3个:1、扩展生存期;2、限制作用域;3、唯一性;

1、扩展生存期

       这一点主要是针对普通局部变量和static局部变量来说的。声明为static的局部变量的生

存期不再是当前作用域,而是整个程序的生存期。

       在程序中,常用内存类型主要有堆、栈和静态存储区。要理解static局部变量就必须首先

理解这三种内存类型。

      在C/C++中, 局部变量按照存储形式可分为三种auto, static, register,局部变量的默认类型都是auto,从栈中分配内存。

auto是在变量在进入其作用域的时候被分配,离开其作用域的时候被释放,static则是按程序的生命周期来分配释放变量即在执行main之前static就被初始化了。等程序结束时才被释放。

(堆、栈、静态存储区的概念)

堆:由程序员自己分配释放(用malloc和free,或new和delete) ,如果我们不手动释放,

那就要到程序结束才释放。如果对分配的空间在不用的时候不释放而一味的分配,那么可

能会引起内存泄漏,其容量取决于虚拟内存,较大。

栈:由编译器自动分配释放,其中存放在主调函数中被调函数的下一句代码、函数参数和

局部变量,容量有限,较小。

静态存储区:由在编译时由编译器分配,由系统释放,其中存放的是全局变量、static变

量和常量.

区别:

1)   堆是由低地址向高地址扩展,栈是由高地址向低地址扩展。

2)   堆是不连续的空间,栈是连续的空间。

3)   在申请空间后,栈的分配要比堆的快。对于堆,先遍历存放空闲存储地址的链表、

修改链表、再进行分配;对于栈,只要剩下的可用空间足够,就可分配到,如果不够,那

么就会报告栈溢出。

4)   栈的生命期最短,到函数调用结束时;静态存储区的生命期最长,到程序结束时;

堆中的生命期是到被我们手动释放时(如果整个过程中都不手动释放,那就到程序结束时

)。


2.限制作用域

      对于全局变量而言,不论是普通全局 变量还是static全局变量,其存储区都是静态存储区,因此在内存分配上没有什么区别。

区别:

1)普通的全局变量和函数,其作用域为整个程序或项目,外部文件(其它cpp文件)可以通过extern关键字访问该变量和函数。

2)static全局变量和函数,其作用域为当前cpp文件,其它的cpp文件不能访问该变量和函数。如果有两个cpp文件声明了同名的全局静态变量,那么他们实际上是独立的两个变量。

    static函数的好处是不同的人编写不同的函数时,不用担心自己定义的函数,是否会与其它文件中的函数同名。

头文件中的static变量。

    如果在一个头文件中声明:static int g_vaule = 0;那么会为每个包含该头文件的cpp都创建一个全局变量,但他们都是独立的;


3.数据唯一性

这是C++对static关键字的重用。主要指静态数据成员/成员函数唯一性指的是static修饰的数据成员/成员函数属于类而不是属于此类的任何对象的变量和函数(针对静态数据成员而言, 成员函数不管是否是static, 在内存中只有一个副本, 普通成员函数调用时, 需要传入this指针, static成员函数调用时, 没有this指针. )

static数据成员的初始化:

(1) 初始化在类体外进行,而前面不加static,以免与一般静态变量或对象相混淆。

(2) 初始化时不加该成员的访问权限控制符private,public等。

(3) 初始化时使用作用域运算符来标明它所属类,因此,静态数据成员是类的成员,而不是对象的成员。

(4) 静态数据成员是静态存储的,它是静态生存期,必须对它进行初始化。


Static成员函数

(1)静态成员函数和静态数据成员一样,它们都属于类的静态成员,它们都不是对象成员。因此,对静态成员的引用不需要用对象名。

(2)静态成员函数仅能访问静态的数据成员,不能访问非静态的数据成员,也不能访问非静态的成员函数,这是由于静态的成员函数没有this指针。


static全局静态变量

在全局变量之前加上关键字static,全局变量就被定义成为一个全局静态变量。

1)内存中的位置:静态存储区(静态存储区在整个程序运行期间都存在)

2)初始化:未经初始化的全局静态变量会被程序自动初始化为0(自动对象的值是任意的,除非他被显示初始化)

3)作用域:全局静态变量在声明他的文件之外是不可见的。准确地讲从定义之处开始到文件结尾。

定义全局静态变量的好处:

<1>不会被其他文件所访问,修改

<2>其他文件中可以使用相同名字的变量,不会发生**。

static局部静态变量

在局部变量之前加上关键字static,局部变量就被定义成为一个局部静态变量。

1)内存中的位置:静态存储区

2)初始化:未经初始化的全局静态变量会被程序自动初始化为0(自动对象的值是任意的,除非他被显示初始化)

3)作用域:作用域仍为局部作用域,当定义它的函数或者语句块结束的时候,作用域随之结束。

注:当static用来修饰局部变量的时候,它就改变了局部变量的存储位置,从原来的栈中存放改为静态存储区。但是局部静态变量在离开作用域之后,并没有被销毁,而是仍然驻留在内存当中,直到程序结束,只不过我们不能再对他进行访问。

当static用来修饰全局变量的时候,它就改变了全局变量的作用域(在声明他的文件之外是不可见的),但是没有改变它的存放位置,还是在静态存储区中。


static的特性

   

   (1)  static的隐藏特性:也就是上面说的static只对当前的cpp有用对于其他文件的cpp是没有用的——隐藏。

   (2)  static的第二个特性是保持变量内容的持久

   (3)  static的第三个特性是默认初始化为0







  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
回答: 在C++中,static关键字主要用于限定对象所使用的内存区域。根据static所应用对象的不同,可以分为全局对象、本地静态对象和类静态成员。在全局变量中使用static关键字,可以将变量存储在静态存储区,使得在函数调用完成后不会释放变量。相比之下,如果没有static修饰符,变量在函数重新被调用时会被再次初始化。\[2\]举个例子,假设有以下代码: ```cpp #include <iostream> using namespace std; int foo1(void){ static int i = 10; return i++; } int foo2(void){ int j = 10; return j++; } int main(void){ cout << "第一次 foo1()=" << foo1() << endl; cout << "第一次 foo2()=" << foo2() << endl; cout << "第二次 foo1()=" << foo1() << endl; cout << "第二次 foo2()=" << foo2() << endl; return 0; } ``` 在这个例子中,foo1()函数中的变量i被声明为静态变量,所以每次调用foo1()函数时,i的值会递增。而foo2()函数中的变量j没有被声明为静态变量,所以每次调用foo2()函数时,j的值都会重新初始化为10。\[3\]这就是C++static关键字的用法。 #### 引用[.reference_title] - *1* *3* [C++ 语法篇之 static 用法](https://blog.csdn.net/yixiwuha/article/details/123145702)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* [C++ static用法总结](https://blog.csdn.net/kupe87826/article/details/121310136)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值