静态变量,静态函数对于一些c,c++的初学者来说,造成了不少的困扰。昨晚和寝室的室友讨论到这

个问题,想了一下,作了一下总结:
虽然说c和c++在很多人的眼里就是孪生姐妹,其实还是有很大区别的。在这里分别谈论在c和c++中静

态成员和静态函数的区别:

c中:
在介绍之前,先说说变量的生存周期和作用域,很多人对这个概念很陌生,或者是ambiguous。
生存周期:是从时间概念上来说,变量在程序启动后,从时间a到时间b这段时间中,变量一直存在于

内存中,那么a->b称为变量的生存周期。它在时间上时连续的,在空间上可以不连续,也就是说,它

可能在a->b这段时间内,程序运行到某段区域,我们无法对变量进行访问,但是,它却是实实在在的

存在于内存中,没有销毁。
作用域:是空间上的概念,是指变量在生存周期内的一个概念,当程序在变量的生存周期a->b内,运

行到某段区域时,该变量如果可操作,那么称这段区域为作用域。

1.static变量:
1)局部:
静态局部变量在函数内定义,生存周期为整个源程序,但作用域与自动变量相同,即只能在函数的作

用于中。退出该函数后,就无法使用了。
2)全局:
全局变量本身就是静态存储方式,当然全局static变量也是静态存储方式。但是他们的作用域是整个

源程序,自动全局变量的作用于也是整个程序,但是这里需要注意的是,如果只有一个源文件,那么

全局静态变量和全局自动变量非常类似,但是如果有多个源文件,那么全局static变量的作用于仅限

于定义所在的源文件,在其他的文件中是无法使用的。就是说在不同的文件中可以定义名称相同的全

局static变量。

2.static函数
static函数在c中也叫内部函数,因为static修饰的函数无法再其它文件中使用,
在介绍之前,先讨论一下 堆,栈,自由存储区,全局/静态存储区和常量存储区
堆:用new分配,free释放
自由存储区:malloc分配,delete释放
栈:编译器管理的局部变量和函数参数等。
全局/静态存储区:存储静态变量和全局变量
字符常量区:常量存储的内存
也就是说static修饰函数的仅有一个意思:就是告诉编译器,我是一个内部函数,不要随便的用我。

(这里插入一个小片段,以前我一直以为c语言中的static函数中只能使用static变量,在今天总结

的时候,发现是错的,呵呵。。)

下面再来看看c++中的static变量和static成员函数:
先看个有趣的例子:
class test
{
private:
static int a;
public:
test(){}
}
int test::a=2;//ok,
void main()
{
cout<<test::a<<endl;//error,因为a是一个private成员函数,可能细心的读者就会问了,为什么

前面的赋初始值可以完成,后面的输出却不行,这里要注意:static成员变量设置初值的时候,不受

任何权限的束缚。但是这里需要解释的是,并不是在任何时候都不受束缚,仅仅在赋初始值的时候不

受权限束缚,如果是在中途改变static成员变量的值的话,必须是public类型的才能改变,否则编译

错误。
例如:
如果
main()
{
test::a=3;//这一句就必须要求static a是public类型的。
}
}
静态成员有一个好处就是在一个对象都没有构造的时候就可以对该变量进行访问。
注意:static成员函数,由于static成员函数并不包含this指针,所以无法对类的非static成员变量

进行任何操作。并且static成员函数是无法声明为const类型的,因为const就是说不会修改该函数所

属的对象,由于static根本就不属于哪个对象,所以会造成编译错误。

转载于:https://www.cnblogs.com/yangxiaoluck/archive/2011/03/06/1972363.html

c语言c++语言中静态变量,函数详解相关推荐

  1. java的匿名函数_JAVA语言中的匿名函数详解

    本文主要向大家介绍了JAVA语言中的匿名函数详解,通过具体的内容向大家展示,希望对大家学习JAVA语言有所帮助. 一.使用匿名内部类 匿名内部类由于没有名字,所以它的创建方式有点儿奇怪.创建格式如下: ...

  2. java jstack使用_JAVA语言之JVM 中jstack命令使用详解

    本文主要向大家介绍了JAVA语言之JVM 中jstack命令使用详解,通过具体的内容向大家展示,希望对大家学习JAVA语言有所帮助. Java程序问题定位时线程栈信息是一个重要线索,如下: " ...

  3. python getattr_Python中的getattr()函数详解:

    标签:Python中的getattr()函数详解: getattr(object, name[, default]) -> value Get a named attribute from an ...

  4. timm 视觉库中的 create_model 函数详解

    timm 视觉库中的 create_model 函数详解 最近一年 Vision Transformer 及其相关改进的工作层出不穷,在他们开源的代码中,大部分都用到了这样一个库:timm.各位炼丹师 ...

  5. python input函数详解_对Python3中的input函数详解

    下面介绍python3中的input函数及其在python2及pyhton3中的不同. python3中的ininput函数,首先利用help(input)函数查看函数信息: 以上信息说明input函 ...

  6. Python中的bbox_overlaps()函数详解

    Python中的bbox_overlaps()函数详解 想要编写自己的目标检测算法,就需要掌握bounding box(边界框)之间的关系.在这之中,bbox_overlaps()函数是一个非常实用的 ...

  7. bind() c语言,c/c++ 标准库 bind 函数详解

    bind函数定义在头文件 functional 中.可以将 bind 函数看作一个通用的函数适配器,它接受一个可调用对象,生成一个新的可调用对象来"适应"原对象的参数列表. bin ...

  8. 内核中的kmalloc函数详解

    一.kmalloc函数详解 #include <linux/slab.h> void *kmalloc(size_t size, int flags); 给 kmalloc 的第一个参数是 ...

  9. 前端如何设置背景颜色的透明度 css中的 rgba() 函数详解 :background-color: rgba(255,192,203,0.3)

    目录 前言 rgba() 函数 详解 再分享一个小技巧哈哈哈 前言 今天在开发移动端的时候感觉没背景颜色有点丑,再加上自己做的是蛋糕app,觉得暖色应该会很好看,于是就用了这行代码 backgroun ...

  10. Opencv中的imshow函数详解

    前言 使用opencv对图像进行处理之后,通常调用imshow函数来显示处理结果.但是,我们经常会发现显示结果和我们预期的结果有些差别.这是由于opencv经常会涉及到对多种图像数据类型的处理,如果我 ...

最新文章

  1. 数据绑定以及Container.DataItem绑定技巧
  2. Java变量的修饰符
  3. Python实现迭代器协议
  4. java学习视频网站_学习Java的视频网站
  5. 理解Linux系统的日志
  6. 创建Live Rates Plan时Sales Organization无法自动带出来的问题
  7. rman打开oracle归档日志,Oracle RAC中使用RMAN管理归档日志
  8. 猎豹浏览器怎么查看历史记录 猎豹浏览器历史记录查看教程
  9. Linux 下的 sleep
  10. Java最大值和最小值
  11. JavaScript数组操作 [Z]
  12. 【Python】pymysql.err.InternalError: (1236, 'Misconfigured master - server_id was not set')
  13. 关于macOS自定义终端命令的方法
  14. 外军网络空间作战简报
  15. 图片太模糊?这几个工具可以将图片变清晰
  16. java开源项目-六个经典的 SpringBoot 练手项目
  17. python数学建模基础教程_Python 数学建模极简入门(一)
  18. Windows内核原理与实现之Windows设备驱动程序
  19. Python语言程序设计(嵩天老师)-期末考核2.1-快乐数字
  20. 2022中国智慧医疗领域最具商业合作价值企业盘点

热门文章

  1. Ajax实现无刷新三联动下拉框
  2. 如何得到数据库中所有表字段及字段中文描述
  3. DataList分页
  4. 【libevent】libevent库学习总结(一)——基础
  5. 海思3536:交叉编译Qt4.8.4
  6. apache httpd server安装的一个问题
  7. python教学上机实验报告怎么写_Python基础(下)
  8. JavaScript_上
  9. 线程、线程匿名内部类、解决线程不安全的方式
  10. Tomcat软件的目录结构、作用