在C++中,局部变量和全局变量有着明显的区别。下面详细解释这些区别及其用法,并通过代码示例进行说明。
1. 局部变量会屏蔽全局变量
局部变量可以与全局变量同名。在函数内引用这个变量时,会优先使用同名的局部变量,而不是全局变量。要引用全局变量,可以使用::
。
#include <iostream>
int var = 10; // 全局变量
void func() {
int var = 20; // 局部变量
std::cout << "Local var: " << var << std::endl; // 输出局部变量 20
std::cout << "Global var: " << ::var << std::endl; // 使用 :: 引用全局变量 10
}
int main() {
func();
return 0;
}
2. 引用已定义的全局变量
可以通过头文件或extern
关键字引用已定义的全局变量。如果通过头文件引用,在编译期间会检测到错误;如果通过extern
引用,在连接期间会报错。
头文件引用:
// global.h
extern int globalVar;
// file1.cpp
#include "global.h"
int globalVar = 100; // 定义全局变量
// file2.cpp
#include "global.h"
#include <iostream>
void printGlobalVar() {
std::cout << "Global Variable: " << globalVar << std::endl;
}
extern引用:
// file1.cpp
int globalVar = 100; // 定义全局变量
// file2.cpp
#include <iostream>
extern int globalVar; // 声明全局变量
void printGlobalVar() {
std::cout << "Global Variable: " << globalVar << std::endl;
}
3. 在多个C文件中定义同名全局变量
可以在不同的C文件中声明同名的全局变量,但只有一个文件中可以对其赋初值,这样连接不会出错。
// file1.cpp
#include <iostream>
static int sharedVar = 50; // 静态全局变量
void func1() {
std::cout << "Shared Var in file1: " << sharedVar << std::endl;
}
// file2.cpp
#include <iostream>
static int sharedVar; // 静态全局变量声明
void func2() {
sharedVar = 100; // 在不同文件中赋值
std::cout << "Shared Var in file2: " << sharedVar << std::endl;
}
代码解读
-
局部变量屏蔽全局变量:
func()
函数中的局部变量var
屏蔽了全局变量var
。使用::var
可以引用全局变量。
-
引用已定义的全局变量:
- 通过头文件
global.h
或extern
关键字引用全局变量globalVar
。
- 通过头文件
-
在多个C文件中定义同名全局变量:
- 使用
static
关键字在不同的C文件中声明同名的全局变量sharedVar
。每个文件中的sharedVar
是独立的,作用域仅限于文件内。
- 使用