C++作用域总结

原创 2012年03月22日 09:40:44

在C++中,涉及到作用域的语法很多,经常混淆。所以对作用域与作用域作一个总结,注意这个总结还不完整,当遇到新的语法时再继续补充。


一、全局作用域(global scope)。

概念:定义在函数外部的名字具有全局作用域。具有全局作用域的名字可以在整个程序中访问,即使不同文件也可以访问。


二、如何访问全局作用域的变量?

1. 变量在本文件中定义。

直接访问。

比如:

// file_1.cpp
int counter;   // definition
// file_1.cpp
cout << counter++ << endl;  

2. 变量在其它文件中定义。

在访问前先要声明,然后才可以使用。例如:

// file_1.cpp
int counter;   // definition
// file_2.cpp
extern int counter; // declaration
cout << couter++ << endl; // counter是在文件file_1.cpp中定义的全局变量
声明没有定义变量,只是告诉编译器在其它文件中有counter这个变量。所以在file_2.cpp中,counter是file_1.cpp定义的全局变量。
注意:我们要区分其它文件与Include。如果include了这个文件,就不再是其它文件了。比如下面的例子,这个时候counter对file_2.cpp是可见了。因为file_2.cpp已经包含了文件file_1.cpp。
// file_2.cpp
#include file_1.cpp

三、const 对象默认为文件的局部变量

在全局作用域定义的const变量,只在该文件中是全局变量,在文件外部是不可见的。

// file_1.cpp
const int counter = 10;   // definition
// file_2.cpp
cout << counter++ << endl;  // error, 文件file_1中的counter在file_2中不可见 
有一种办法可以把const变量变为全局变量,其它文件也可以访问。方法是在定义时加上extern修饰符,这样在整个程序中都可以访问该const对象了。

// file_1.cpp
extern const int counter = 10;   // definition
// file_2.cpp
cout << counter++ << endl;  // OK 
当然,file_1.cpp定义的counter必须是在全局作用域定义的。


注意:这里的extern修饰符与普通的extern修饰符作用不同。这里是将const变为整个程序的全局变量,而普通的extern修饰符是声明一个变量。同一个符号在不同的上下文中意思不同甚至完全不同,这就是C++难以掌握的原因之一,所以总结就变得更加重要了。


------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

总结的不完整,以后见到涉及作用域的知识点再继续补充。




相关文章推荐

C++ 作用域规则

  • 2014年12月18日 11:38
  • 15KB
  • 下载

C++参数传递与作用域

  • 2011年07月18日 14:37
  • 1005KB
  • 下载

从零开始学C++之对象的使用(二):四种对象生存期和作用域、static 用法总结

一、四种对象生存期和作用域 栈对象 隐含调用构造函数(程序中没有显式调用) 堆对象 隐含调用构造函数(程序中没有显式调用),要显式释放 全局对象、静态全局对象 全局对象的构造先于m...

浅析C/C++作用域之全局变量

楼主今天遇到一件很蛋疼的事,写了不到30行代码居然出错,尼玛气人的是半天找不到原因,真是少壮不努力老大徒伤悲啊! 废话少说,先看代码: (IDE=vs2010) Head.h #ifndef ...

C++基础篇--作用域和自定义命名空间

引子    为引出本文主题,先举个例子,以便后文对照理解:某学校一年招了3个叫李明的学生,为便于区分:1)按年龄排序分别称大、中、小李明;2)把他们分到不同班,这样各班内部就没有同名的李明,而学校范围...
  • ipmux
  • ipmux
  • 2015年03月23日 17:19
  • 2826

Item 33:避免隐藏继承来的名称(继承与作用域嵌套) Effective C++笔记

Item 33: Avoid hiding inherited names. 其实本文的话题和继承完全没有关系,隐藏名称是作用域的问题。 在C++中每一对{ }都会开启一个新的作用域,并嵌套在当前...
  • yangjvn
  • yangjvn
  • 2015年09月22日 10:09
  • 1333

4.C++ 存储类,作用域

C++随记(八)---存储持续性、作用域和链接性

作者:teeyohuang 邮箱:teeyohuang@163.com 本文系原创,供交流学习使用,转载请注明出处,谢谢 版权声明:本篇文章是阅读《C++primer plus (第6版)中文...

C++中各种类型的变量的存储区域和作用域

C++中各种类型的变量的存储区域和作用域 变量有:全局变量、静态全局变量、静态局部变量、局部变量。 按照存储区域分,全局变量,静态全局变量和静态局部变量都是存储在内存的静态存储区域的,局部变量存放...

C++的存储持续性(自动、静态、动态),作用域,链接性

1.c++使用三种不同的方案进行数据的存储,z
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:C++作用域总结
举报原因:
原因补充:

(最多只允许输入30个字)