第1例——static关键字的三种作用

术语static有着不寻常的历史.起初,在C中引入关键字static是为了表示退出一个块后仍然存在的局部变量。随后,static在C中有了第二种含义:用来表示不能被其它文件访问的全局变量和函数。为了避免引入新的关键字,所以仍使用static关键字来表示这第二种含义。最后,C++重用了这个关键字,并赋予它与前面不同的第三种含义:表示属于一个类而不是属于此类的任何特定对象的变量和函数。

第一种作用:

程序开始时为静态变量分配空间,结束时释放空间,默认初始化为0,使用时可以改变其值。

// demo001_001.cpp : 定义控制台应用程序的入口点。
//

#include "stdafx.h"
#include <windows.h>

int fun(void)
{
	static int count = 10; // 程序开始初始化一次,之后不会再执行,作用域在fun函数里面,盛名周期是整个程序

	return count--;
}

int count;            //全局变量,和静态的count不是同一个变量,默认初始化为0

int _tmain(int argc, _TCHAR* argv[])
{
	printf("global\t\tlocal static\n");

	for (; count <= 10; ++count)

		printf("%d\t\t%d\n", count, fun());

	system("pause");
	return 0;
}

第二种作用:

静态变量或静态函数只有在它的作用域才能访问它,它的名字在其它文件中不可见。

为什么第一种作用中,整个生命周期都存在的count和全局变量count同名,却没有冲突?这就是static的第二个作用,隐藏。

// stdafx.cpp : 只包括标准包含文件的源文件

#include "stdafx.h"

static int number = 100;          //全局静态变量,作用域是当前文件

int count = 100;                  //全局变量,作用域是整个项目

void show()                       //全局函数,作用域是整个项目
{
	printf("6666666666\n");
}
// demo001_001.cpp : 定义控制台应用程序的入口点。
//

#include "stdafx.h"
#include <windows.h>

extern int count;                //声明,extern关键第二例会说明
extern void show();              //声明,extern关键第二例会说明

extern int number;               //错误,number只能在stdafx.cpp被访问
            
int _tmain(int argc, _TCHAR* argv[])
{
	printf("%d\n",count);
	show();

	system("pause");
	return 0;
}

static将变量和函数都隐藏在他们的作用域,外面访问不到。

第三种作用:

直接使用类,不需要具体的对象,就可以使用静态成员变量和静态函数。

static void show(){};         //类的静态方法,可以直接被类调用
DemoClass::show();

扩展一下:

C、C++中内存分配方式可以分为三种:

(1)从静态存储区域分配:

内存在程序编译时就已经分配好,这块内存在程序的整个运行期间都存在。速度快、不容易出错,因为有系统会善后。例如全局变量,static变量等。

(2)在栈上分配:

在执行函数时,函数内局部变量的存储单元都在栈上创建,函数执行结束时这些存储单元自动被释放。栈内存分配运算内置于处理器的指令集中,效率很高,但是分配的内存容量有限。

(3)从堆上分配:

即动态内存分配。程序在运行的时候用malloc或new申请任意大小的内存,程序员自己负责在何时用free或delete释放内存。动态内存的生存期由程序员决定,使用非常灵活。如果在堆上分配了空间,就有责任回收它,否则运行的程序会出现内存泄漏,另外频繁地分配和释放不同大小的堆空间将会产生堆内碎块。

一个C、C++程序编译时内存通常认为会分为5大存储区:堆区、栈区、全局区、文字常量区、程序代码区等。

全局变量、静态全局变量、静态局部变量和局部变量的区别

变量可以分为:全局变量、静态全局变量、静态局部变量和局部变量。

(1) 按存储区域分,全局变量、静态全局变量和静态局部变量都存放在内存的静态存储区域,局部变量存放在内存的栈区。

(2) 按作用域分,全局变量在整个工程文件内都有效;静态全局变量只在定义它的文件内有效;静态局部变量只在定义它的函数内有效,只是程序仅分配一次内存,函数返回后,该变量不会消失;局部变量在定义它的函数内有效,但是函数返回后失效。

全局变量(外部变量)的说明之前再冠以static就构成了静态的全局变量。全局变量本身就是静态存储方式,静态全局变量当然也是静态存储方式。这两者在存储方式上并无不同。这两者的区别虽在于非静态全局变量的作用域是整个源程序,当一个源程序由多个源文件组成时,非静态的全局变量在各个源文件中都是有效的。 而静态全局变量则限制了其作用域,即只在定义该变量的源文件内有效,在同一源程序的其它源文件中不能使用它。由于静态全局变量的作用域局限于一个源文件内,只能为该源文件内的函数公用,因此可以避免在其它源文件中引起错误。

从以上分析可以看出, 把局部变量改变为静态变量后是改变了它的存储方式即改变了它的生存期。把全局变量改变为静态变量后是改变了它的作用域, 限制了它的使用范围。

时间: 2024-10-10 06:29:21

第1例——static关键字的三种作用的相关文章

[java]static关键字的四种用法

在java的关键字中,static和final是两个我们必须掌握的关键字.不同于其他关键字,他们都有多种用法,而且在一定环境下使用,可以提高程序的运行性能,优化程序的结构.下面我们先来了解一下static关键字及其用法. static关键字 1.修饰成员变量 在我们平时的使用当中,static最常用的功能就是修饰类的属性和方法,让他们成为类的成员属性和方法,我们通常将用static修饰的成员称为类成员或者静态成员,这句话挺起来都点奇怪,其实这是相对于对象的属性和方法来说的.请看下面的例子:(未避

.NET(c#)new关键字的三种用法

前几天去家公司面试,有一道这样的题:写出c#中new关键字的三种用法,思前想后挖空心思也只想出了两种用法,回来查了下msdn,还真是有第三种用法:用于在泛型声明中约束可能用作类型参数的参数的类型,这是在Framework 2.0 中定义泛行时才会使用到的,自己对c# 2.0 中的支持还只是粗通皮毛,怪不得累死so many脑细胞也没能想不出这第三种来! 三种用法如下: 在 C# 中,new 关键字可用作运算符.修饰符或约束. 1)new 运算符:用于创建对象和调用构造函数.这种大家都比较熟悉,没

同一个关键字,三种匹配方式投放的问题

同一个关键字,用3种匹配方式投放,调整出价的时候应该怎么调整. 一般情况下,这三种匹配方式指的是精确匹配,词组匹配和广泛匹配.为什么要有这三种匹配方式? 个人感觉原因就是你发现有一个词是自己产品的很准确的关键词,当你添加到账户之后,运用某种匹配方式,如词组匹配,运行一段时间,发现展示量很少,CTR很低,这时候,你会考虑是否要更改匹配方式,如更改成广泛匹配,但更改的同时你不知道会带来怎么样的后果,所以就直接在原账户里添加一个广泛匹配和精确匹配(即完全匹配),如[A],"A",A然后从搜索

Python中逗号的三种作用

最近研究python  遇到个逗号的问题 一直没弄明白 今天总算搞清楚了 1.逗号在参数传递中的使用: 这种情况不多说  没有什么不解的地方 就是形参或者实参传递的时候参数之间的逗号 例如def  abc(a,b)或者abc(1,2) 2.逗号在类型转化中的使用 主要是元组的转换 例如: >>> a=11>>> b=(a)>>> b11>>> b=(a,)>>> b(11,)>>> b=(a,22)

static关键字(二)作用总结

静态变量和静态方法 static关键字最基本的用法是: 1.被static修饰的变量属于类变量,可以通过类名.变量名直接引用,而不需要new出一个类来 2.被static修饰的方法属于类方法,可以通过类名.方法名直接引用,而不需要new出一个类来 被static修饰的变量.被static修饰的方法统一属于类的静态资源,是类实例之间共享的,换言之,一处变.处处变.JDK把不同的静态资源放在了不同的类中而不把所有静态资源放在一个类里面,很多人可能想当然认为当然要这么做,但是是否想过为什么要这么做呢?

NEW关键字的三种用法

声明:本文最初是本人从他出转载到51CTO上的一篇文章,但现在记不清最初从出处了,原文作者看到还请原来,现在发表在这里只为学习,本人在51CTO的该文章的地址为:http://kestrelsaga.blog.51cto.com/3015222/751536 一.             new运算符 ①     用于创建对象和调用构造函数. 例如: Class1 obj  = new Class1(); ②     还可用于创建匿名类型的实例: var query = from cust in

php函数,static,globalkeyword及三种变量作用域

函数 和js函数相似,关注php与其它语言不用的地方 函数的形參默认值 形式: function f($a,$b=3,$vc = "abc"){ } 注意:没有给默认值的形參必须传递值, 形參的传值问题 一句话:形參的传值问题.事实上就是"变量之前的传值问题",即实參变量传给形參变量.有值传递和引用传递 引用传递(须要在形參前面加&符号而不是实參): function f($a,& $b){ } 函数參数的数量的问题 通常,形參和实參的数量是一致的:

Java基础(二)-static关键字分析

static关键字是我们在编程中经常会使用到的,但有些可能只知其然而不知其所以然.下面介绍static关键字的作用再通过例子结合说明. static关键字共有五种作用(先说明static所修饰的不会改变其(private.protected.default和public)作用域的范围): 修饰成员变量(非局部变量) 修饰成员方法 修饰代码块 修饰内部类 静态导包 怎么会有五种呢,大部分初学者对前面两种或者加上第三种还是很熟悉的,第四种情况可能一开始的人就比较少知道了,第五种就更少人知道了.下面一

《带你装B,带你飞》pytest成神之路2- 执行用例规则和pycharm运行的三种姿态

1. 简介 今天北京下的雪好大好美啊!!!哎呀,忘记拍照片了,自己想象一下吧.言归真传,今天还是开始pytest的学习和修炼,上一篇写完后群里反响各式各样的,几家欢乐几家愁,有的高兴说自己刚好要用到了,正好一起学习,有的不开心说自己接口还没有学完了,没关系的学习本来就不是一件一蹴而就的事情,需要日积月累,不要灰心.慢慢的来,多花点时间,争取赶上来就好了.嘿嘿!喝了宏哥的毒鸡汤是不是充满活力,感觉好多了.好,那就开始今天的学习吧!今天主要学习一下pytest的执行用例的规则. 2. 通过help帮