06、C++作用域介绍

厨子大约 3 分钟C++C++基础编程程序厨

本文主要介绍下C++中作用域的概念。

作用域,一般可以理解为变量或函数的可见范围,不同的变量(全局变量、局部变量、静态变量)它的作用域是不同的。

而作用域大体可以分全局作用域命名空间作用域类域函数作用域等。

全局作用域

比较好理解,如果在一个源文件中定义了一个全局变量,那这个变量的作用域就是整个源文件。

比如:

// test.cc
int global = 1;

void func() {
  cout << global;
}

void func2() {
  cout << global;
}

注意这里global的作用域是在作用在整个源文件中,只在本文件内可访问。

而一个应用程序可以由多个源文件组成,在其他文件其实也可以访问这个global变量,但是不能直接访问,比如:

// test2.cc
void func() {
  cout << global;
}

void func2() {
  cout << global;
}

这样是不能编译通过的,这里需要在test2.cc中使用extern声明一下:

// test2.cc
extern int global;
void func() {
  cout << global;
}

void func2() {
  cout << global;
}

这里的extern int global;表示在声明一个global变量,但却不在此文件内定义,它的定义会存在于其他源文件中。

通过extern声明后,在test2.cc中就可以访问test.cc中的global全局变量了。

那有没有办法定义一个全局变量,只在当前源文件内可访问,其它源文件不可见呢?

可以,加个static关键字:

// test.cc
static int global = 1;
void func() {
  cout << global;
}

void func2() {
  cout << global;
}

static在这里表示局部的含义,表示只在当前源文件可见。在开发的过程中大家如果有上面的需求(只希望在源文件内可见),无论是变量还是函数,建议都使用static修饰。

命名空间作用域

一般在C++中所有的变量或者函数或者类都会封装在namespace中:

namespace chengxumiao {
  int meow;
}

int func() {
  cout << meow;
}

上面的代码会报错,因为func根本不知道meow是什么,meow是在chengxumiaonamespace下,如果想访问它,有几种方式:

int func() {
    cout << chengxumiao::meow;
}

可以这样显式指定chengxumiao下的meow,或者:

namespace chengxumiao {
  int func() {
    cout << meow;
  }
}

可以这样把func也包裹在chengxumiaonamespace下,两者共处同一个namespace就可以访问了,或者:

using namespace chengxumiao;
int func() {
  cout << meow;
}

这样使用using就表示默认会去chengxumiaonamespace下找对应的变量。

类域

就是只可在当前类内访问:

class A {
  int a;
  int b;

  void f() {
    cout << a;
  }
};

像这种就可以理解为是类域,只有当前类内的函数才可以访问当前类内的变量,其他类或者外部是不可以访问当前类的东西的。

函数作用域

这块也可以理解为局部变量的作用域:

void f() {
  int a;
  cout << a;
}

比如在函数内定义的变量只能在当前函数内访问,其它地方是不能访问的。

注意:上面的各种概念可能和书本上的不太一样,我是本着易于理解的角度来介绍的,可能有些概念整理的不是很书面且标准。