C++基础系列【6】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是在chengxumiao
的namespace
下,如果想访问它,有几种方式:
int func() {
cout << chengxumiao::meow;
}
可以这样显式指定chengxumiao
下的meow
,或者:
namespace chengxumiao {
int func() {
cout << meow;
}
}
可以这样把func
也包裹在chengxumiao
的namespace
下,两者共处同一个namespace
就可以访问了,或者:
using namespace chengxumiao;
int func() {
cout << meow;
}
这样使用using
就表示默认会去chengxumiao
的namespace
下找对应的变量。
类域
就是只可在当前类内访问:
class A {
int a;
int b;
void f() {
cout << a;
}
};
像这种就可以理解为是类域,只有当前类内的函数才可以访问当前类内的变量,其他类或者外部是不可以访问当前类的东西的。
函数作用域
这块也可以理解为局部变量的作用域:
void f() {
int a;
cout << a;
}
比如在函数内定义的变量只能在当前函数内访问,其它地方是不能访问的。
注意:上面的各种概念可能和书本上的不太一样,我是本着易于理解的角度来介绍的,可能有些概念整理的不是很书面且标准。
作者介绍
- 程序喵大人
- 35- 资深C/C++/Rust/Android/iOS客户端开发
- 10年大厂工作经验
- 嵌入式/人工智能/自动驾驶/音视频/游戏开发入门级选手
- 《C++20高级编程》《C++23高级编程》等多本书籍著译者
C++训练营
专为校招、社招3年工作经验的同学打造的1V1 C++训练营,量身定制学习计划、每日代码review,简历优化,面试辅导,已帮助多名学员获得offer!训练营介绍