博客
关于我
C++中的auto与static用法
阅读量:311 次
发布时间:2019-03-03

本文共 2713 字,大约阅读时间需要 9 分钟。

  static被称为静态修饰符,一般用于修饰变量与函数。在讲static之前先说一下自动修饰符auto是怎么回事。

void function(){		int a = 5;	auto int b=7;	……}

  在以上的代码块中,变量a与变量b的性质是一模一样的,都是自动变量,auto是可以被省略的。熟悉微机原理的同学应该清楚,计算机在内存中专门划分了一个区域,叫栈(stack)。栈使用一个后进先出的数据结构,即LIFO,最后进入栈的变量首先被弹出(这里稍微注意一下是弹出不是删除)。

  在程序运行过程中,如果function()这个函数被调用的话,那么自动变量a与b的值将会被压入栈中;function()函数开始执行之后,自动变量a和b就会和压入栈中的对应的值关联起来;当function()函数结束后,栈顶指针将移动到压栈前的位置,即两个值从栈中弹出。
  可见自动变量的生命周期往往是短暂的,其生命周期是和其被包含的函数息息相关:当包含它的函数被使用,自动变量就会“活”过来,包含它的函数停止使用,自动变量就会“死掉”。而且很明显可以看出,自动变量每一次“活”过来,都会重新初始化一次,代码块中的function()每被调用一次,a与b都会重新自动初始化为5和7,这也许是自动变量名称的由来。
  自动变量在短暂的人生发现了一件事,变量越是依附于函数存在,越容易在意想不到的地方失败,除非超越自动变量。于是一些变量不做自动变量了。
  C++中静态变量有三种形式:

int globalValue=100;//静态变量,外部链接static int fileValue=200;//静态变量,内部链接int main(){	……}void function1(){	static int internalValue=300;//静态变量,无链接	int autoValue=400;//自动变量	……}

  由以上的代码块可以看出,C++依靠链接性为静态变量进行分类:外部链接性(其他文件可访问)、内部链接性(只在本文件中访问)、无链接性(只能在当前函数或代码块中访问)。与自动变量相比,各种静态变量的生命周期更长,它们在整个程序的执行周期中都是存在的。此外,程序在运行过程中,静态变量的数量不会改变,代码写出来几个就一直是几个,因此也不需要栈来动态管理它们。实际上,编译器会分配固定的内存块来存储静态变量。如果没有显式地初始化静态变量,静态变量也会和动态变量一样设定为0.

  globalValue和fileValue是全局变量,区别在于:globalValue可以被该文件之外的文件调用,其它文件调用globalValue时,只需要声明如下即可:

extern int globalValue;

  fileValue就不一样了,由于该变量被static修饰,因此该静态变量是不可以被外部的文件调用的,其有效范围只在本文件中。该文件中的任何函数都可以使用fileValue和globalValue,但是另外的文件只可以使用globalValue。在全局变量的层面上,static表现为确定变量的内外部链接性。

  internalValue的生命周期是整个程序的执行周期,这点与autoValue形成了强烈对比。由于生命周期的不同,internalValue与autoValue还拥有一个较为直观的区别:每次调用function1(),autoValue都会被重新初始化为400;然而internalValue只会初始化一次,当internalValue的值变化后,再调用function1(),internalValue仍会保留改变后的值,而不是初始化为300。从局部变量的层面上,static表现为确定变量的存储持续性。

file1//:int globalValue=100;//静态变量,外部链接……file2//:static int globalValue=200;//静态变量,内部链接void function3(){	cout<<	globalValue<

  以上的代码块可以很明显的发现内部链接静态变量与外部链接静态变量的区别。在file2中也定义了一个globalValue,但是用static进行了修饰,即覆盖了外部链接的globalValue,因此在function3()中打印globalValue的值时打印出来的是200而不是100。

  如果非要在file2中调用file1中的globalValue呢?好在C++提供了一个办法。

file1//:int globalValue=100;//静态变量,外部链接……file2//:static int globalValue=200;//静态变量,内部链接extern int globalValue;//声明引用了fille1中的静态变量void function3(){	cout<<	globalValue<

  C++提供了作用域解析运算符::,该运算符用于表示该变量的全局版本,因此在 function3()中第二句打印出来的值是100。

  static还可以用来修饰函数,在默认情况下,函数的链接性是外部的。

file1//:void function4(int a){	……}file2//:extern void function4(int a);function4(9);……

  static可以将函数的链接性设置为内部的,即外部的其他文件不可以对其调用。此外,该静态函数将覆盖外部定义,即使其他文件中定义了同名称的函数,也不影响该静态函数在该文件中的使用。如下代码所示:

file1//:void function5(int a);void function5(int a){	cout<<

  static还可以用来类成员函数,当static修饰类成员函数时,又表现出特别的性质:

  1.不能通过对象调用静态成员函数,静态成员函数不能使用this指针。较为直观的感觉是,静态成员函数不属于具体的对象,单纯属于包含其定义的类。如果静态成员函数属于public区域,则可以使用类名和作用域解析运算符调用。比如如下所示的一个静态成员函数:

static int num(){return num_string;}

  2.静态类成员函数只能使用静态数据成员。以上函数中的num_string必须是个静态成员变量

  调用该成员函数的方式如下:

int count = String::num();

转载地址:http://ktlm.baihongyu.com/

你可能感兴趣的文章
Mac book pro打开docker出现The data couldn’t be read because it is missing
查看>>
MAC M1大数据0-1成神篇-25 hadoop高可用搭建
查看>>
mac mysql 进程_Mac平台下启动MySQL到完全终止MySQL----终端八步走
查看>>
Mac OS 12.0.1 如何安装柯美287打印机驱动,刷卡打印
查看>>
MangoDB4.0版本的安装与配置
查看>>
Manjaro 24.1 “Xahea” 发布!具有 KDE Plasma 6.1.5、GNOME 46 和最新的内核增强功能
查看>>
mapping文件目录生成修改
查看>>
MapReduce程序依赖的jar包
查看>>
mariadb multi-source replication(mariadb多主复制)
查看>>
MariaDB的简单使用
查看>>
MaterialForm对tab页进行隐藏
查看>>
Member var and Static var.
查看>>
memcached高速缓存学习笔记001---memcached介绍和安装以及基本使用
查看>>
memcached高速缓存学习笔记003---利用JAVA程序操作memcached crud操作
查看>>
Memcached:Node.js 高性能缓存解决方案
查看>>
memcache、redis原理对比
查看>>
memset初始化高维数组为-1/0
查看>>
Metasploit CGI网关接口渗透测试实战
查看>>
Metasploit Web服务器渗透测试实战
查看>>
MFC模态对话框和非模态对话框
查看>>