C++变量作用域
前言
这一节我们将学习变量作用域的相关知识,可能会涉及到一些C++的基本语法以及C++变量类型的相关知识,如果你还有不明白的,请到C++基本语法和C++变量类型这里温故一下
C++变量作用域
1. 变量的定义位置
在C++中,根据变量定义的位置,变量可以分为以下几类:
- 局部变量:在函数或代码块中声明的变量,只能在该函数或块中使用。
- 形式参数:函数的参数,它是函数调用时用来接收外部传入数据的变量。
- 全局变量:在所有函数之外声明的变量,可以在整个程序中使用。
2. 什么是作用域?
作用域是一个变量可以被访问的“范围”或“区域”。根据变量的定义位置,它的作用域可以分为以下几种:
(1)局部作用域
- 定义位置:在函数内部声明。
- 特点:
- 只能在函数内部访问,函数外部无法使用。
- 每次调用函数时,局部变量都会被创建;函数结束后,局部变量会被销毁。
- 示例:
1
2
3
4
5void myFunction() {
int x = 10; // x 是局部变量
std::cout << x << std::endl;
}
// 这里无法访问 x
(2)全局作用域
- 定义位置:在所有函数之外。
- 特点:
- 全局变量可以被程序中的任何函数访问。
- 全局变量在程序启动时创建,程序结束时销毁。
- 示例:
1
2
3
4
5int x = 20; // x 是全局变量
void myFunction() {
std::cout << x << std::endl; // 可以访问全局变量 x
}
(3)块作用域
- 定义位置:在代码块
{}内部。 - 特点:
- 只能在块内部访问,块外部无法使用。
- 每次执行代码块时,块作用域的变量都会被创建,执行完后销毁。
- 示例:
1
2
3
4
5{
int x = 30; // x 是块作用域变量
std::cout << x << std::endl;
}
// 这里无法访问 x
(4)类作用域
- 定义位置:在类的内部。
- 特点:
- 类作用域的变量可以被类的所有成员函数访问。
- 它的生命周期与类的对象相同。
- 示例:
1
2
3
4
5
6
7
8
9
10
11class MyClass {
private:
int x; // x 是类作用域的变量
public:
void setX(int value) {
x = value; // 可以访问类的变量 x
}
int getX() {
return x;
}
};
3. 特殊情况:变量重名
如果在内部作用域中声明的变量与外部作用域中的变量同名,内部作用域的变量会覆盖外部作用域的变量。
- 示例:
1
2
3
4
5
6int x = 50; // 全局变量 x
void myFunction() {
int x = 10; // 局部变量 x,覆盖了全局变量 x
std::cout << x << std::endl; // 输出 10
}
小总结
- 局部变量:在函数或代码块中声明,只能在内部使用。
- 全局变量:在所有函数之外声明,可以在程序的任何地方使用。
- 块作用域变量:在
{}中声明,只能在块内部使用。 - 类作用域变量:在类内部声明,可以被类的所有成员函数使用。
局部变量
什么是局部变量?
- 局部变量是在函数或代码块内部声明的变量,它们的作用范围仅限于声明它们的那个函数或代码块。
- 当函数执行结束时,局部变量就会被销毁。
示例:
1 |
|
解释:
a,b,c是局部变量,它们只能在main()函数中使用。- 当程序运行到
return 0;时,a,b,c会被销毁,无法在main()之外访问。
全局变量
什么是全局变量?
- 全局变量是在所有函数之外定义的变量。
- 它们的作用范围是整个程序,可以在任何函数中使用。
- 全局变量在程序开始时创建,在程序结束时销毁。
示例:
1 |
|
解释:
g是全局变量,a和b是局部变量。g可以被程序中的任何函数访问,比如main()。
## 局部变量和全局变量同名时的情况
- 如果局部变量和全局变量同名,在函数内部使用的是局部变量,局部变量会覆盖全局变量的值。
示例:
1 |
|
解释:
- 全局变量
g的值是20,但在main()函数中,局部变量g的值是10。 - 当程序运行到
cout << g;时,优先使用局部变量g,所以输出是10。
小总结
局部变量:
- 定义在函数或代码块内部。
- 只能在声明它的地方使用,离开作用域就无法访问。
- 在函数结束时销毁。
全局变量:
- 定义在所有函数外部。
- 作用范围是整个程序,任何函数都可以访问。
- 在程序运行期间一直存在。
局部变量和全局变量的初始化
局部变量和全局变量的初始化
局部变量
- 局部变量是定义在函数或代码块内部的变量。
- 特点:
- 局部变量不会自动初始化,如果没有赋值,变量的值是随机的,可能会导致意外的结果。
- 示例:
1
2
3
4
5int main() {
int x; // 局部变量未初始化
std::cout << x; // 输出随机值
return 0;
}
全局变量
- 全局变量是定义在所有函数之外的变量。
- 特点:
- 全局变量会自动初始化,默认值取决于数据类型:
数据类型 默认值 int0 char'\0'float0.0 double0.0 指针 NULL - 示例:
1
2
3
4
5
6int x; // 全局变量自动初始化为 0
int main() {
std::cout << x; // 输出 0
return 0;
}
- 全局变量会自动初始化,默认值取决于数据类型:
块作用域
块作用域指的是在代码块 {} 内部定义的变量,这些变量只在该块内有效。
示例:
1 |
|
输出:
1 | 块变量: 20 |
解释:
- 在块
{}内部声明的变量a是一个新的变量,覆盖了外部变量a。 - 块执行完后,内部变量
a被销毁,外部变量a重新生效。
类作用域
类作用域指的是在类中声明的变量,这些变量属于类,可以被类的所有成员函数访问。
示例:
1 |
|
输出:
1 | 类变量: 30 |
解释:
class_var是类的一个静态变量,属于整个类,而不是某个对象。- 使用类名和作用域解析符号
::可以直接访问它,无需创建类的实例。
小总结
- 局部变量:需要手动初始化;仅在函数或代码块内有效。
- 全局变量:自动初始化;在整个程序中都可访问。
- 块作用域:块内的变量会覆盖外部变量,块结束后自动销毁。
- 类作用域:类中的变量可以通过类名访问,生命周期与类相关。
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来源 Matou🚢!
评论








