当前位置: 首页 > article >正文

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是在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;
}

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

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


作者介绍

  • 程序喵大人
  • 35- 资深C/C++/Rust/Android/iOS客户端开发
  • 10年大厂工作经验
  • 嵌入式/人工智能/自动驾驶/音视频/游戏开发入门级选手
  • 《C++20高级编程》《C++23高级编程》等多本书籍著译者

C++训练营

专为校招、社招3年工作经验的同学打造的1V1 C++训练营,量身定制学习计划、每日代码review,简历优化,面试辅导,已帮助多名学员获得offer!训练营介绍


http://www.kler.cn/a/538318.html

相关文章:

  • DeepSeek-R1模型的数学原理(说人话)
  • 蓝桥杯C语言组:图论问题
  • 求组合数,
  • std::memory_order
  • 【华为OD-E卷 - 113 跳格子2 100分(python、java、c++、js、c)】
  • LSSVM最小二乘支持向量机多变量多步光伏功率预测(Matlab)
  • 模拟开发小鹅通首页网站练习
  • 国产编辑器EverEdit - 编辑辅助功能介绍
  • 如何利用Python爬虫获取商品销量详情:应对eBay反爬策略的实战指南与代码示例
  • DeepseekR1无审查版本
  • DeepSeekMoE 论文解读:混合专家架构的效能革新者
  • 【鸿蒙HarmonyOS Next实战开发】实现组件动态创建和卸载-优化性能
  • 简洁美观地址发布页HTML源码
  • 镜头放大倍率和像素之间的关系
  • 2025Java面试题超详细整理《微服务篇》
  • spring知识点梳理
  • MySQL性能优化MySQL索引失效的13种隐蔽场景排查及解决方法
  • 响应式编程库(三) -r2dbc
  • 差分算法解析
  • w196Spring Boot高校教师科研管理系统设计与实现
  • 高速网络的未来:零拷贝Zero-Copy架构
  • 国产AI大模型DeepSeek的本地化部署
  • 数据留痕的方法
  • WordPress wp-recall插件存在SQL注入漏洞(CVE-2024-32709)
  • 响应式编程_04Spring 5 中的响应式编程技术栈_WebFlux 和 Spring Data Reactive
  • 【异常解决】在idea中提示 hutool 提示 HttpResponse used withoud try-with-resources statement