C++变量的可见性(转)

我们之前介绍过,在某一个函数中,不应该有两个名字相同的变量。可是,我们拿下面这段程序代码(程序11.1.3)去测试一下,发现居然在同一个函数中可以有两个名字相同的变量。这又是怎么回事呢?编译器又是如何辨别这两个名字相同的变量的呢?
#include
"iostream.h"
int main()
{
   int a=3,b=4;
   {
      int
a=5,b=6;
      {
         char a=‘a‘,b=‘b‘;
         cout <<a
<<b <<endl;
      }
      cout <<a <<b
<<endl;
   }
   cout <<a <<b <<endl;
   return
0;
}

运行结果:
ab
56
34

我们已经说明,变量可以使用的范围是由变量的作用域决定。不同层次的变量的作用域,就好像大小不一的纸片。把它们堆叠起来,就会发生部分纸片被遮盖的情况。我们把这种变量作用域的遮盖情况称为变量的可见性(Visibility)。如下面的图11.1所示:

编译器正是根据变量的可见性,来判断我们到底引用哪个变量的。具体在程序中就是: 
#include
"iostream.h"
int main()
{
   int a=3,b=4;//整型变量a=3、b=4的作用域开始
 
 {
      int a=5,b=6;//整型变量a=5、b=6的作用域开始,整型变量a=3、b=4不可见
      {
       
 char a=‘a‘,b=‘b‘;//字符型变量a=‘a‘、b=‘b‘作用域开始,整型变量a、b不可见
         cout <<a
<<b <<endl;//输出字符型变量,整型变量a、b不可见
     
}//字符型变量a=‘a‘、b=‘b‘作用域结束
      cout <<a <<b
<<endl;//输出整型变量a=5、b=6,整型变量a=3、b=4不可见
   }//整型变量a=5、b=6的作用域结束
 
 cout <<a <<b <<endl; //输出整型变量a=3、b=4
   return
0;
}//整型变量a=3、b=4的作用域结束

然而,当两张纸处于同一个层次,显然两者就不可能发生遮盖了。所以,如果我们在同一个层次中声明两个名字相同的变量,那么他们的作用域就不是遮盖,而是冲突了。

因此,在某个函数的同一语法层次内不能声明多个名字相同的变量。

时间: 2025-01-01 03:05:59

C++变量的可见性(转)的相关文章

面向对象语言成员变量方法可见性在继承中的变化

最近做得的有点杂,接触到几种面向对象的语言,C#,C++,JAVA .在一个情景下,软件的框架已经写好了,我们要对其功能实现增加和修改,这种情况是经常发生的,那么在面向对象的程序设计中我们要怎么做呢.我们都知道面向对象语言有几个特点,多态,封装,继承,既然框架已经写好了,我们修改功能可以考虑用继承的方法去实现新的功能,那么这样做对原有的功能会有影响么?这就涉及到成员变量成员方法可见性在继承中的变化了. 首先,我们看C++ 派生类通过继承,将基类的成员作为自己的一部分,但不同的继承方式导致基类的成

趣谈Java变量的可见性问题

了解过多线程的我们,对synchorized,sleep和valatile都比较了解,但是当这三个名词和“Java变量得可见性”的话题联系在一起不知道大家是否还可以保持大脑清晰??? 最近看到一个关于Java变量可见性的问题,感觉比较新鲜就查了一些资料,下面分享给大家: 首先给大家看一段关于多线程的执行代码: package com.test; import java.util.concurrent.TimeUnit; public class test1 { private static bo

关于变量的可见性和生命周期

变量的可见性又叫做作用域. 一般来说变量如果是在栈上分配的,那么变量的可见性和生命周期是一样的.但在堆区,静态区,常量区的变量声明周期大于变量的可见性(如果理解有误,请大佬们指出). 即指针对应的是可见性,而指针所指向的对象(也即指针所指向的内存)对应的是生命期.因为指针是在栈上分配存储的(指针也是一个变量),所以其可见性如前面所述,是栈这种存储方式的表现形式.当指针出栈时,它本身不可见了,从而也间接的导致了它所指向的对象变得不可见,但这时这个对象本身的生命期并没有结束,因为对象本身并不是在栈上

OC基础笔记——成员变量的可见性(广州黑马一期)

@private:私有的,只有本类的对象方法中中可以直接访问访问它 成员变量在那个类中定义的才能在那个类中使用 @protected:受保护的:只能在本类和子类中可以直接访问,不再外部访问 @public:公共的,大家都可以用,在本类,子类,外部都可以访问 @package: 主要用在框架内部,在框架内部相当于@protected,在框架外部相当于@private(了解) 本类:定义这个成员变量的类 控制可见性的修饰符,从使用开始直到所有成员变量结束或遇到其他的控制可见性修饰符为止 在实现文件里

Java 理论与实践: 正确使用 Volatile 变量

Java 语言中的 volatile 变量可以被看作是一种 "程度较轻的 synchronized":与 synchronized 块相比,volatile 变量所需的编码较少,并且运行时开销也较少,但是它所能实现的功能也仅是synchronized 的一部分.本文介绍了几种有效使用 volatile 变量的模式,并强调了几种不适合使用 volatile 变量的情形. 锁提供了两种主要特性:互斥(mutual exclusion) 和可见性(visibility).互斥即一次只允许一个

C# 中的局部static变量

其实这问题没什么可讨论的,C#不支持局部静态变量. 但还是想了一下C#为什么不支持局部静态变量,以下均是个人想法. C++和C支持局部静态变量,也就是在一个函数的内部声明一个静态变量,这种变量的特定如下: 静态局部变量在函数内定义,但不象自动变量那样,当调用时就存在,退出函数时就消失.静态局部变量始终存在着,也就是说它的生存期为整个程序的生命周期 静态局部变量的生存期虽然为整个源程序,但是其作用域仍与自动变量相同,即只能在定义该变量的函数内使用该变量.退出该函数后,尽管该变量还继续存在,但不能使

Java中的变量与变量的作用域

关于Java中的变量及变量的作用域 关于Java中的变量及变量的作用域 0. 变量的概念 在程序运行期间,系统可以为程序分配一块内存单元,用来存储各种类型的数据.系统分配的内存单元要使用一个标记符来标识,这种内存单元中的数据是可以更改的.所有叫变量.定义变量的标记符就是变量名,内存单元中所装载的数据就是变量值.用一个变量定义一块内存以后,程序就可以用变量名代表这块内存中的数据.根据所存储数据类型的不同,有各种不同类型的变量. 1. Java的变量类型 2. 注意变量的有效取值范围 系统为不同的变

关于synchronized 影响可见性的问题

问题来自于学习thinking in java的时候的一个示例,先上代码吧 public class StopThread { private static boolean stop = false; public static void main(String[] args) throws InterruptedException { Thread t = new Thread(new Runnable(){ public void run() { int i = 0; while (!sto

深入理解Java虚拟机笔记---原子性、可见性、有序性

Java内存模型是围绕着并发过程中如何处理原子性.可见性.有序性这三个特征来建立的,下面是这三个特性的实现原理: 1.原子性(Atomicity) 由Java内存模型来直接保证的原子性变量操作包括read.load.use.assign.store和write六个,大致可以认为基础数据类型的访问和读写是具备原子性的.如果应用场景需要一个更大范围的原子性保证,Java内存模型还提供了lock和unlock操作来满足这种需求,尽管虚拟机未把lock与unlock操作直接开放给用户使用,但是却提供了更