static的用法详解--C语言和C++分别介绍
来源:互联网 发布:石家庄企业办公软件 编辑:程序博客网 时间:2024/05/23 13:53
先上一道题目:
下面程序的输出是( )?
#include < stdio.h>
int fun3(int x)
{
static int a=2;
a+=x;
return(a);
}
void main()
{
int k=2,m=1,n;
n=fun3(k);
n+=fun3(m);
printf(“%d\n”,n);
}
本题分析:本题考查关键点是static,后面会对此进行详细的分析。本题需要注意的是,static只对元素初始化一次。
答案:9,因此第二次调用函数的时候,a=4,不再进行初始化。
C 语言的 static 关键字有三种(具体来说是两种)用途:
静态局部变量:
用于函数体内部修饰变量,这种变量的生存期长于该函数
static是在全局数据区分配的,那么它存在的意思是什么?
答:它存在的意义就是随着第一次函数的调用而初始化,却不随着函数的调用结束而销毁。
static是在什么时候进行初始化:
它是在第一次调用语句时进入函数的时候初始化一次。且只初始化一次,也就是第二次再调用语句时,不会继续初始化,而直接跳过。
静态局部变量和全局变量有什么区别?
相同点:两者都是初始化一次,存放在全局数据区(也称静态区)。
异同点:全局变量不属于函数本身,不再受函数的控制,而静态局部变量隶属于函数。
静态局部变量保存在全局数据区,而不是保存在栈中,每次的值保存到下一次调用,直到下次赋新值。
静态全局变量:
定义在函数体外,用于休息修饰全局变量,表示该变量只在本文件可见。
特点:静态全局变量不能被其它文件所用(全局变量可以);
其他文件中可以定义相同名字的变量,不会发生冲突,因为static隔离了文件。
静态函数:
静态函数跟静态全局变量作用类似:
总结:
上面一共说了三种用法,为什么说准确来说是两种呢?
1.一种是修饰变量,一种是修饰函数,所以说是两种(这种解释不多)。
2.静态全局变量和修饰静态函数的作用是一样的,一般合并为一种。(这是比较多的分法)。
C++ 语言的 static 关键字有二种用途:
1. 静态数据成员:
使用方法: static int s_sum; //在数据成员前加关键字
用于修饰class的数据成员,即所谓“静态成员”。这种数据成员的生存期大于class的对象。静态数据成员是每个class有一份,普通数据成员是每个实体一份,因此静态数据成员也叫做类变量,普通数据成员叫做实例变量。
对于非静态数据成员,每个类对象(实例)都有自己的拷贝。而静态数据成员被当作是类的成员,由该类型的所有对象共享访问,对该类的多个对象来说,静态数据成员只分配一次内存。
静态数据成员存储在全局数据区。静态数据成员定义时要分配空间,所以不能在类声明中定义。
2。静态成员函数:
用于修饰class的成员函数
使用方法: static void GetSum() //在函数名前加static
那么静态成员函数有特点呢?
1.静态成员之间可以相互访问,包括静态成员函数访问静态数据成员和访问静态成员函数;
2.非静态成员函数可以任意地访问静态成员函数和静态数据成员;
3.静态成员函数不能访问非静态成员函数和非静态数据成员;
4.调用静态成员函数,可以用成员访问操作符(.)和(->)为一个类的对象或指向类对象的指针调用静态成员函数,也可以用类名::函数名调用(因为他本来就是属于类的,用类名调用很正常)
转载地址:http://blog.csdn.net/majianfei1023/article/details/45290467
特别鸣谢~
- static的用法详解--C语言和C++分别介绍
- c语言static的用法
- C 语言 static 的用法
- C语言中static用法介绍
- C语言中static用法介绍
- c语言中static用法详解
- C语言中的static用法详解
- c 语言static用法
- c语言static用法
- C语言STATIC用法
- C语言STATIC用法
- c语言static用法
- C语言static用法
- c语言中static和extern的用法详细解析
- c语言中static和extern的用法详细解析
- 【转】c语言static和extern的用法
- C语言中static的含义和用法
- C语言中的extern,static和register的一些用法
- java内存区域讲解
- nodejs的安装配置
- springmvc三种返回值方式
- 选择排序
- HtmlUnit实现模拟浏览器点击按钮的效果
- static的用法详解--C语言和C++分别介绍
- TCP对SACK的处理以及乱序的处理细节
- 面向过程和面向对象
- linux sar命令
- 改进版简易卖票系统,线程操作
- 【游戏跨场景寻路】基于as3语言的游戏地图跨场景寻路功能的实现
- linux 标准流管道 popen 源码理解
- Spring Ioc创建源码分析
- HDU 4027 Can you answer these queries?——其实是点更新的区间更新线段树