首页 > 编程语言 >C++定义变量与生存周期

C++定义变量与生存周期

时间:2022-09-19 10:22:29浏览次数:67  
标签:变量 作用域 局部变量 C++ 静态 全局变量 定义

作用域:作用域即一个变量可以被引用的范围,常见的作用域可分为 6 种:全局作用域,局部作用域,语句作用域,类作用域,命名空间作用域和文件作用域。

全局变量:具有全局作用域。全局变量只需在一个源文件中定义,就可以作用于所有的源文件。其他不包含全局变量定义的源文件需要用 extern 关键字再次声明这个全局变量。

静态全局变量:具有文件作用域。它与全局变量的区别在于如果程序包含多个文件的话,它作用于定义它的文件里,不能作用到其它文件里,即被 static 关键字修饰过的变量具有文件作用域。这样即使两个不同的源文件都定义了相同名字的静态全局变量,它们也是不同的变量。

局部变量:具有局部作用域。它是自动对象(auto),在程序运行期间不是一直存在,而是只在函数执行期间存在,函数的一次调用执行结束后,变量被撤销,其所占用的内存也被收回,局部变量对于函数外部的程序来说是不可见的。当然内部实际更复杂,实际是以 {} 为作用域的。

静态局部变量:具有局部作用域。它只被初始化一次,自从第一次被初始化直到程序运行结束都一直存在,它和全局变量的区别在于全局变量对所有的函数都是可见的,而静态局部变量只对定义自己的函数体始终可见, 只有定义该变量的函数内部可以使用访问和修改该变量。

静态局部变量和局部变量的区别:生命周期不一样,静态局部变量会存在到程序结束,也就是说反复调用静态局部变量的函数,静态局部变量只会初始化一次,所以会依照上次结果继续进行计算,而局部变量会重新计算。

生命周期:即该变量可以被引用的时间段(生存期表示变量存在的时间)。

  • 全局变量: 全局变量在整个程序运行期间都会一直存在,都可以随时访问,当程序结束时,对应的变量则会自动销毁,内存会被系统回收。
  • 局部变量: 局部变量的生命周期仅限于函数被调用期间,当函数调用结束时,该变量会自动销毁。
  • 静态局部变量:实际上静态局部变量的作用域仅限于函数内部,它的作用域与局部变量相同,但实际上该变量在程序运行期间是一直存在的,生命周期贯穿于整个程序运行期间。局部静态变量只能被初始化一次。

变量分配空间问题:

    不同生命周期的变量,在程序内存中的分布位置是不一样的,程序内容分为代码区(.text)、全局数据区(.data.bss.rodata)、堆区(heap)、栈区(stack),不同的内存区域,对应不同的生命周期。

  静态变量一般是储存在数据段,包括data段、bss段、rodata段,其中data储存已经初始化的静态变量和全局变量,bss储存未初始化的静态变量与全局变量。

  局部变量一般存储在栈区或者堆区。

  静态变量和栈变量(存储在栈中的变量)、堆变量(存储在堆中的变量)的区别:静态变量会被放在程序的静态数据存储区(.data 段,bss 段,rodata 段)中(静态变量会自动初始化),这样可以在下一次调用的时候还可以保持原来的赋值。而栈变量或堆变量不能保证在下一次调用的时候依然保持原来的值。
  静态变量和全局变量的区别:静态变量仅在变量的作用范围内可见,实际是依靠编译器来控制作用域。全局变量在整个程序范围内都可可见,只需声明该全局变量,即可使用。
  全局变量定义在不要在头文件中定义:如果在头文件中定义全局变量,当该头文件被多个文件 include 时,该头文件中的全局变量就会被定义多次,编译时会因为重复定义而报错,因此不能再头文件中定义全局变量。一般情况下我们将变量的定义放在 .cpp 文件中,一般在 .h 文件使用extern 对变量进行声明。

 

标签:变量,作用域,局部变量,C++,静态,全局变量,定义
From: https://www.cnblogs.com/acec/p/16705449.html

相关文章

  • C/C++公交路线自动化选择系统
    C/C++公交路线自动化选择系统程序设计题1:公交路线自动化选择系统实现出题人:张勤面向专业:测控技术与仪器难度等级:31问题描述要求编写一个程序,实现公交路线的自动......
  • C++11 -- 匿名函数(lambda 表达式)
    0.一道题目引入关于sb力扣定义外部函数和变量报错这件事最初我定义了一个\(cmp\)函数用来对\(vector\)排序,和一个全局变量\(unordered\_map\)用来记录元素个数......
  • 37. OKhttp自定义配置
    37.OKhttp自定义配置37.1Builder构建者OkHttpClientokHttpClient=newOkHttpClient.Builder().build();提供更多操作37.2拦截器OkHttpClientokHttpClient=newO......
  • 03(C++二级)
    1.函数不可嵌套定义,但可以嵌套调用。2.静态数据成员必须在类外初始化,使用类名调用。 初始化格式:<数据类型><类名>::<静态数据成员名>=<值>3.C++不能重载的:     ......
  • 霍夫变换原理及实现(Opencv C++)
    已知一幅图像中的n个点,假设我们希望找到这些点中位于直线上的子集。一种可能的解决方法是,首先找到由每对点确定的所有直线,然后寻找靠近特定直线的那些点的所有子集。这种方......
  • C++中深拷贝和浅拷贝
    浅拷贝:简单的赋值拷贝操作深拷贝:在堆区重新申请空间,进行拷贝操作 浅拷贝和深拷贝的问题出现的条件:1、拷贝构造函数2、用new关键字在堆区申请空间 在拷贝构造函数......
  • 实例-rust-打开环境变量
    main.rsusestd::process::Command;fnmain(){letoutput=ifcfg!(target_os="windows"){Command::new("cmd").arg("/C")......
  • C语言:利用指针交换两个变量 的值
    #include<stdio.h>voidswap(int*p1,int*p2){inttmp=*p1;*p1=*p2;*p2=tmp;}voidswap1(int*p1,int*p2){ *p1=*p1+*p2; *p2=*p1-*p2; *p1=*p1-*p......
  • C++ 我的世界皮肤雕像
    #include<iostream>#include<string>#include<windows.h>#include"minecraft.h"usingnamespacestd;TxMinecraftmc;intmain(intargc,char**argv){ bool......
  • 计算机是以IEEE 754标准定义的浮点数存储小数
    为什么负数要用补码表示?十进制转换二进制的方法相信大家都熟能生巧了,如果你说你还不知道,我觉得你还是太谦虚,可能你只是忘记了,即使你真的忘记了,不怕,贴心的小林在和你一起回......