现在的位置: 首页 > 自动控制 > 工业·编程 > 正文

C++作用域总结

2012-12-04 22:51 工业·编程 ⁄ 共 1175字 ⁄ 字号 暂无评论

在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++难以掌握的原因之一,所以总结就变得更加重要了。

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

给我留言

留言无头像?