C++作用域

作用域通常和变量捆绑在一起,限定了变量可用范围,同时也规定了变量的生命周期:何时创建、何时销毁。作用域通常分为:全局作用域和局部作用域。

全局作用域(全局变量)

在所用函数体外部定义的变量就是全局变量,具有全局作用域。它在main函数执行前创建,mian函数结束后销毁。下面的代码演示了全局变量的创建和销毁:

   1:  class World 
   2:  {
   3:  public:
   4:      World()
   5:      {
   6:          std::cout << "Hello world.\n" ;
   7:      }
   8:   
   9:      ~World()
  10:      {
  11:          std::cout << "Goodbye.\n";
  12:      }
  13:  };
  14:   
  15:  World theWorld ;
  16:   
  17:  int main()
  18:  {
  19:      std::cout << "Hello from main.\n" ;
  20:      return 0 ;
  21:  }

这段代码的执行结果是 :

theWorld对象在main函数执行前被创建,main结束后销毁。

局部作用域(局部变量)

局部作用域是一对大括号包围的区域,局部变量在在程序流进入其作用域时被创建,退出作用域时被销毁。下面一段代码演示了局部变量的创建和销毁:

   1:  class World 
   2:  {
   3:  public :
   4:      World(int id)
   5:          :identifier(id)
   6:      {
   7:          std::cout << "Hello from " << identifier << ".\n" ;
   8:      }
   9:   
  10:      World ()
  11:          :identifier(0)
  12:      {
  13:          std::cout << "Hello from default constructor .\n" ;
  14:      }
  15:      ~World()
  16:      {
  17:          std::cout << "Goodbye from " << identifier << ".\n" ;
  18:      }
  19:   
  20:  private:
  21:      const int identifier ;
  22:  };
  23:   
  24:  World theWorld ;
  25:   
  26:  int main()
  27:  {
  28:      World smallworld(1);
  29:   
  30:      for(int i = 2 ; i < 4 ; i ++)
  31:      {
  32:          World aWorld(i);
  33:      }
  34:   
  35:      World oneMoreWorld(4);
  36:  }

执行结果为:

说明:

  1. 为类World添加了一个常量成员identifier,用来标识World的不同实例。identifier在构造函数的前导中初始化。
  2. 执行时,在main前调用默认构造函数创建theWorld
  3. 进入main函数,首先创建smallWorld(identifier = 1),smallWorld的是main函数内的局部变量,作用域是整个main函数
  4. 进入for循环局部作用域,创建和销毁了identifier = 2和identifier = 3的World两个实例
  5. for作用域结束,进入到main局部作用域,创建局部变量oneMoreWorld (identifier = 4)
  6. main作用域结束,销毁main作用域内的局部变量。销毁局部变量时和创建的顺序相反,即先销毁oneMoreWorld,然后是smallWorld
  7. 最后程序执行到末尾,销毁全局变量theWorld.
时间: 2024-10-06 11:21:55

C++作用域的相关文章

一招制敌 - 玩转 AngularJS 指令的 Scope (作用域),讲得特别好

学习了AngularJS挺长时间,最近再次回首看看指令这部分的时候,觉得比自己刚开始学习的时候理解的更加深入了,尤其是指令的作用域这部分. 步入正题: 每当一个指令被创建的时候,都会有这样一个选择,是继承自己的父作用域(一般是外部的Controller提供的作用域或者根作用域($rootScope)),还是创建一个新的自己的作用域,当然AngularJS为我们指令的scope参数提供了三种选择,分别是:false,true,{}:默认情况下是false. scope = false 首先我们来看

CSS作用域问题

今天去长虹面试,面试官问了一个问题,就是给一个div在三个地方设置不同的background,最后div显示的颜色是哪一个?当时我第一次回答的是最后一个,但是后来又改口说是第一个,回来一验证,证明自己错了,今天就总结一下CSS样式的作用域问题吧. 首先对HTML引入样式的优先级排序,数字越大优先级越高#### 样式优先级1. 浏览器缺省设置2. 外部样式表3. 内部样式表(位于 <head> 标签内部)4. 内联样式(在 HTML 元素内部) ---#### 外部样式表>浏览器缺省设置H

JavaScript的进阶之路(二)函数简介,变量、作用域和内存问题

<h3>ECMAScript中函数不存在函数签名的概念,没有重载</h3><h3>无需指定返回值,可以在任何时候返回任何值.未指定返回值的函数,返回的是一个特殊的undefined值</h3> <script type="text/javascript"> function sayHi(){ console.log("Hi"); }; sayHi(); function sayName(name,age){

JavaScript栈和堆内存,作用域

1.栈 stack"和"堆 heap": 简单的来讲,stack上分配的内存系统自动释放,heap上分配的内存,系统不释放,哪怕程序退出,那一块内存还是在那里.stack一般是静态分配内存,heap上一般是动态分配内存. 2.基本类型和引用类型: 基本类型:存放在栈内存中的简单数据段.数据大小确定,内存空间大小可以分配. 引用类型:存放在堆内存中的对象,变量中实际保存的是一个指针,这个指针指向另一个位置.每个空间大小不一样,要根据情况开进行特定的分配. 详见<Javas

深入理解javascript的作用域--函数声明为什么会前置

标签: javascript函数对象 这篇博文解决了以下迷惑 函数声明为什么前置 函数声明前置和变量前置优先级问题 为什么js文件开头就可以使用Math,String等库,而不需要导入头文件 1.变量对象VO 变量对象(Variable Object, 缩写为VO)是一个抽象 概念中的"对象",它用于存储执行上下文中的: 1. 变量 2. 函数声明 3. 函数参数 js解释器就是通过变量对象(VO)来找到我们定义的变量和函数的. 举个例子: var a = 10; function t

【JS】JavaScript中的执行环境与作用域

JavaScript中的执行环境定义了变量或函数有权访问的数据(每个函数都有自己的执行环境),全局执行环境是最外围的执行环境,在浏览器中,全局执行环境就是window对象,所以所有的全局变量和函数都是作为window对象的属性和方法创建的.当某一个执行环境中所有代码执行完成后,该环境就被销毁,保存在其中的变量和函数也将被销毁,全局执行环境在关闭网页或浏览器时才被销毁. 当代码在一个环境中执行时,会创建变量对象的一个作用域链(保证对执行环境有权访问的变量和函数的有序访问),如果环境是函数,将其活动

Python之路18-函数作用域、全局变量、局部变量

#全局变量 school = 'lianhedaxue' def test(name):     #强制修改全局变量     global school     school = 'haha'     print ('before change',name,school)     name = 'Jack'   #这个函数就是这个变量的作用域     print ('after change',name) name = 'Tom' test(name) print (name) print (s

javascript变量声明和作用域提升

以前的知识总是忘,遇到代码又看不懂.要再复习一下,顺便记录一下. 1 add(1,2); 2 function add(a,b){ 3 alert(a+b); 4 } 代码能输出3,为什么不是按顺序执行?应该是  //add is not defined ... javascript的变量声明具有hoisting机制,JavaScript引擎在执行的时候,会把所有变量的声明都提升到当前作用域的最前面. 也就是说,function add(a,b){alert(a+b)}是一个函数声明,告诉我们有

【】五句话搞定JavaScript作用域

JavaScript的作用域一直以来是前端开发中比较难以理解的知识点,对于JavaScript的作用域主要记住几句话,走遍天下都不怕... 一.“JavaScript中无块级作用域” 在Java或C#中存在块级作用域,即:大括号也是一个作用域.  Java  C# 在JavaScript语言中无块级作用域 1 2 3 4 5 6 7 function Main(){     if(1==1){         var name = 'seven';     }     console.log(n

面向对象之对象,作用域及this

object eg: var o = { a : 2, b : 3 }; console.log(o); console.log(typeof o); console.log(o.a.toFixed(2)); ==> var o = new Object(); o.a = 2; o.b = 3; console.log(o); console.log(typeof o); console.log(o.a.toFixed(2)); eg: var person = { name: “张三”, ag