栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

C static&C++ static

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

C static&C++ static

C static&C++ static C static
  • 栈区: 由编译器自动分配释放,像局部变量,函数参数,都是在栈区。会随着作用于退出而释放空间。
  • 堆区:程序员分配并释放的区域,像malloc©,new(c++) 。
  • 全局数据区(静态区):全局变量和静态便令的存储是放在一块的,初始化的全局变量和静态变量在一块区域,未初始化的全局变量和未初始化的静态变量在相邻的另一块区域,程序结束释放。
  • 代码区:存放程序的代码,即CPU执行的机器指令,只读。

1 静态局部变量:用于函数体内部修饰变量,这种变量的生存期长于该函数。

int foo() {
	static int i = 1; // note:1 // 编译时在全局数据区(静态区)分配内存,初次执行到此处初始化,后续不再初始化,可以一直累加。程序结束才释放。
	//int i = 1;  // note:2 // 每次运行到此处,在栈上重新创建初始化,离开作用域释放。
	i += 1;
	return i;
}
  1. 该变量在全局数据区分配内存(局部变量在栈区分配内存);
  2. 静态局部变量在程序执行到该对象的声明处时被首次初始化,即以后的函数调用不再进行初始化(局部变量每次函数调用都会被初始化);
  3. 静态局部变量一般在声明处初始化,如果没有显式初始化,会被程序自动初始化为0(局部变量不会被初始化);
  4. 静态局部变量始终驻留在全局数据区,直到程序运行结束。但其作用域为局部作用域,也就是不能在函数体外面使用它(局部变量在栈区,在函数结束后立即释放内存)。

2 静态全局变量:定义在函数体外,用于修饰全局变量,表示该变量只在本文件可见。

static int i = 1;  //note:3 // 文件隔离,静态全局变量,仅当前cpp可见。
//int i = 1;  //note:4 // 全局变量,其他cpp也可见。

int foo() {
	i += 1;
	return i;
}

假设我有一个文件a.c,我们再新建一个b.c,内容如下。

//file a.c
//static int n = 15;  //note:5 // 静态全局变量,undeference to "n",找不到符号定义,文件隔离。
int n = 15;  //note:6 // 全局变量,可以正常调用。

//file b.c
extern int n; // 用extern声明其他文件的n,供本cpp使用。
void fn() {
	n++;
	printf("after: %dn",n);
}

void main() {
	printf("before: %dn",n);
	fn();
}

3 静态全局函数:和静态全局变量类似。

//file a.c
void fn() {
	printf("this is non-static func in a"); // 全局函数,可以正常调用。如果加上static,找不到符号定义,文件隔离。
}

//file b.c
extern void fn();  //我们用extern声明其他文件的fn(),供本cpp使用。
void main() {
    fn();
}
C++ static

除了C语言的3种用法,还有额外的2种。

1 静态数据成员:用于修饰 class 的数据成员,即所谓“静态成员”。这种数据成员的生存期大于 class 的对象(实体 instance)。静态数据成员是每个 class 有一份,普通数据成员是每个 instance 有一份,因此静态数据成员也叫做类变量,而普通数据成员也叫做实例变量。

class Rectangle {
private:
	int m_w,m_h;
	static int s_sum;

public:
	Rectangle(int w,int h) {
		this->m_w = w;
		this->m_h = h;
		s_sum += (this->m_w * this->m_h);
	}

	void GetSum() {
		cout<<"sum = "<
	cout<<"sizeof(Rectangle)="<GetSum();
	cout<<"sizeof(rect1)="<class Rectangle {
private:
	int m_w,m_h;
	static int s_sum;

public:
	Rectangle(int w,int h) {
		this->m_w = w;
		this->m_h = h;
		s_sum += (this->m_w * this->m_h);
	}

	static void GetSum() {  //这里加上static 
		cout<<"sum = "<
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/892544.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号