c++ static用法总结(实用干货)

主要参考–> 这里

写下来是为了记忆更加深刻,欢迎大家指正,希望和大家一起学习进步!


static 用法总结


  • 讨论static关键字时,主要从两个方面进行:

1、作用域

2、生命周期


static 主要包括以下用法:

  1. 静态局部变量

顾名思义,静态局部变量是指定义在函数内部的变量,例如:

int function()
{
	static int a = 1;     // sign1
	int b = 2;            //sign2
	int c = 3;
	...(operations)
}

a. 作用域局限于函数 function内部,不能在函数体外使用它,运行时间是整个程序运行期间(生命周期是直到程序结束);

b. 该变量在全局数据区(常量字符串,(未)初始化的全局变量和静态变量)分布内存,局部变量在栈区分配内存;

c. 当调用函数 function 时,静态局部变量在第一次调用进入到 sign1 时被初始化,以后不管调用多少次都不需要再次初始化变量 a,而位于 sign2 的局部变量每次调用 function 都需要重新初始化;

  1. 静态全局变量

作用域只能是在该文件内部,生存周期为整个程序运行期间,例如现在有两个 hpp:

**********************************************
//1.hpp
static int a = 1;
int b = 2;
...
**********************************************
//2.hpp
#include<iostream>

int a = 3; // extern int a; error!!!
extern static int b;

int main()
{
	int c = a + b ;
	std::cout << "sum of a and b: "<< c ;
	system("pause");
}
// c = 5
***********************************************

由于 1.hpp 中变量 a 只能在该文件起作用,所以可以在 2.hpp 中重新定义,并且 2.hpp 也可以直接引用变量 b;但是 2.hpp 不能直接引用 a,因为 a 的作用域限制。

Attention!:使用 #include<1.hpp>就可以在 2.hpp 中直接使用变量 a 了.

  1. 静态函数

作用同静态全局变量,作用域:该文件内部,生命周期:整个程序运行期间,

别的文件不能直接调用,除非同上使用#include<1.hpp>调用 1.hpp中的函数,所以它和静态全局变量的好处是:

1、开发者不希望这个函数或者变量在其他文件中用到或者出现;

2、开发者依旧可以在其他文件中定义名称相同的变量或者函数,避免冲突!

  1. 类中静态数据成员以及静态成员函数

静态数据成员:生存期大于 class 的对象(实体 instance)。多个文件使用或者继承某个类时,静态数据成员(也叫类变量)是每个 class 独一份日月更替,唯我独尊!,普通数据成员(实例变量)是每个 instance 调用时重新赋值花心鬼!

好处:

1、静态数据成员节省内存,参考静态局部变量,注意: 静态数据成员存储在全局数据区,定义时要分配空间,所以不能在类声明中定义。

2、静态成员函数的好处特点

这里 介绍的很好,我直接引用来:

1、当类的某些属性需要所有对象都能够统一公用一分内存的时候,就可以定于成静态成员变量
2、静态成员函数可以直接使用类去调用,所有当需要查看类的静态成员变量属性的时候可以直接通过静态成员函数去调用,而不需要具体对象去调用
3、因为static 成员属于类,而不属于具体的对象,所有static成员函数不能使用this指针

备注:如果有理解错误的地方,欢迎指正!

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 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、付费专栏及课程。

余额充值