前言

这一节我们将学习变量作用域的相关知识,可能会涉及到一些C++的基本语法以及C++变量类型的相关知识,如果你还有不明白的,请到C++基本语法C++变量类型这里温故一下

C++变量作用域

1. 变量的定义位置

在C++中,根据变量定义的位置,变量可以分为以下几类:

  • 局部变量:在函数或代码块中声明的变量,只能在该函数或块中使用。
  • 形式参数:函数的参数,它是函数调用时用来接收外部传入数据的变量。
  • 全局变量:在所有函数之外声明的变量,可以在整个程序中使用。

2. 什么是作用域?

作用域是一个变量可以被访问的“范围”或“区域”。根据变量的定义位置,它的作用域可以分为以下几种:

(1)局部作用域

  • 定义位置:在函数内部声明。
  • 特点
    • 只能在函数内部访问,函数外部无法使用。
    • 每次调用函数时,局部变量都会被创建;函数结束后,局部变量会被销毁。
  • 示例
    1
    2
    3
    4
    5
    void myFunction() {
    int x = 10; // x 是局部变量
    std::cout << x << std::endl;
    }
    // 这里无法访问 x

(2)全局作用域

  • 定义位置:在所有函数之外。
  • 特点
    • 全局变量可以被程序中的任何函数访问。
    • 全局变量在程序启动时创建,程序结束时销毁。
  • 示例
    1
    2
    3
    4
    5
    int 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
    11
    class MyClass {
    private:
    int x; // x 是类作用域的变量
    public:
    void setX(int value) {
    x = value; // 可以访问类的变量 x
    }
    int getX() {
    return x;
    }
    };

3. 特殊情况:变量重名

如果在内部作用域中声明的变量与外部作用域中的变量同名,内部作用域的变量会覆盖外部作用域的变量。

  • 示例
    1
    2
    3
    4
    5
    6
    int x = 50; // 全局变量 x

    void myFunction() {
    int x = 10; // 局部变量 x,覆盖了全局变量 x
    std::cout << x << std::endl; // 输出 10
    }

小总结

  • 局部变量:在函数或代码块中声明,只能在内部使用。
  • 全局变量:在所有函数之外声明,可以在程序的任何地方使用。
  • 块作用域变量:在 {} 中声明,只能在块内部使用。
  • 类作用域变量:在类内部声明,可以被类的所有成员函数使用。

局部变量


什么是局部变量?

  • 局部变量是在函数或代码块内部声明的变量,它们的作用范围仅限于声明它们的那个函数或代码块。
  • 当函数执行结束时,局部变量就会被销毁。

示例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#include <iostream>
using namespace std;

int main() {
// 局部变量
int a, b, c;

// 初始化变量
a = 10;
b = 20;
c = a + b;

cout << c; // 输出 30
return 0;
}

解释

  • a, b, c 是局部变量,它们只能在main()函数中使用。
  • 当程序运行到return 0;时,a, b, c会被销毁,无法在main()之外访问。

全局变量

什么是全局变量?

  • 全局变量是在所有函数之外定义的变量。
  • 它们的作用范围是整个程序,可以在任何函数中使用。
  • 全局变量在程序开始时创建,在程序结束时销毁。

示例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#include <iostream>
using namespace std;

// 全局变量
int g;

int main() {
// 局部变量
int a = 10, b = 20;

g = a + b; // 赋值给全局变量 g

cout << g; // 输出 30
return 0;
}

解释

  • g是全局变量,ab是局部变量。
  • g可以被程序中的任何函数访问,比如main()

## 局部变量和全局变量同名时的情况

  • 如果局部变量和全局变量同名,在函数内部使用的是局部变量,局部变量会覆盖全局变量的值

示例:

1
2
3
4
5
6
7
8
9
10
11
12
13
#include <iostream>
using namespace std;

// 全局变量
int g = 20;

int main() {
// 局部变量
int g = 10;

cout << g; // 输出 10
return 0;
}

解释

  • 全局变量g的值是20,但在main()函数中,局部变量g的值是10
  • 当程序运行到cout << g;时,优先使用局部变量g,所以输出是10

小总结

  • 局部变量

    • 定义在函数或代码块内部。
    • 只能在声明它的地方使用,离开作用域就无法访问。
    • 在函数结束时销毁。
  • 全局变量

    • 定义在所有函数外部。
    • 作用范围是整个程序,任何函数都可以访问。
    • 在程序运行期间一直存在。

局部变量和全局变量的初始化


局部变量和全局变量的初始化

局部变量

  • 局部变量是定义在函数或代码块内部的变量。
  • 特点
    • 局部变量不会自动初始化,如果没有赋值,变量的值是随机的,可能会导致意外的结果。
    • 示例
      1
      2
      3
      4
      5
      int main() {
      int x; // 局部变量未初始化
      std::cout << x; // 输出随机值
      return 0;
      }

全局变量

  • 全局变量是定义在所有函数之外的变量。
  • 特点
    • 全局变量会自动初始化,默认值取决于数据类型:
      数据类型 默认值
      int 0
      char '\0'
      float 0.0
      double 0.0
      指针 NULL
    • 示例
      1
      2
      3
      4
      5
      6
      int x;  // 全局变量自动初始化为 0

      int main() {
      std::cout << x; // 输出 0
      return 0;
      }

块作用域

块作用域指的是在代码块 {} 内部定义的变量,这些变量只在该块内有效。

示例:

1
2
3
4
5
6
7
8
9
10
11
#include <iostream>

int main() {
int a = 10; // 外部变量
{
int a = 20; // 块作用域变量,覆盖外部变量 a
std::cout << "块变量: " << a << std::endl; // 输出 20
}
std::cout << "外部变量: " << a << std::endl; // 输出 10
return 0;
}

输出:

1
2
块变量: 20
外部变量: 10

解释

  • 在块 {} 内部声明的变量 a 是一个新的变量,覆盖了外部变量 a
  • 块执行完后,内部变量 a 被销毁,外部变量 a 重新生效。

类作用域

类作用域指的是在类中声明的变量,这些变量属于类,可以被类的所有成员函数访问。

示例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
#include <iostream>

class MyClass {
public:
static int class_var; // 类作用域变量
};

// 定义类变量并初始化
int MyClass::class_var = 30;

int main() {
std::cout << "类变量: " << MyClass::class_var << std::endl; // 输出 30
return 0;
}

输出:

1
类变量: 30

解释

  • class_var 是类的一个静态变量,属于整个类,而不是某个对象。
  • 使用类名和作用域解析符号 :: 可以直接访问它,无需创建类的实例。

小总结

  1. 局部变量:需要手动初始化;仅在函数或代码块内有效。
  2. 全局变量:自动初始化;在整个程序中都可访问。
  3. 块作用域:块内的变量会覆盖外部变量,块结束后自动销毁。
  4. 类作用域:类中的变量可以通过类名访问,生命周期与类相关。