C++的作用域详细解读

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档

文章目录

  • 前言
  • 一、作用域是什么?
  • 二、作用域类别
    • 1.全局作用域(global scope)
    • 2.名字空间作用域(namespace scope)
    • 3.局部作用域(local scope)
    • 4.类作用域(class scope)
    • 5.语句作用域(statement scope)
  • 三、复杂情况
  • 总结


前言

写C++离不开一个重要的概念那就是作用域,作用域是C++语言非常重要的一个概念,接下来我们就一起看看C++的作用域。


一、作用域是什么?

C++ 中的作用域(scope)指的是变量、函数或其他标识符的可见和可访问的范围。

二、作用域类别

C++有5种作用域,具体详见下面。

1.全局作用域(global scope)

除非名字定义在一个语言结构中(比如,一个类或函数),否则就是全局作用域。其实,全局作用域概念应该放在最下面更容易理解,只要不是其它4种作用域就是全局作用域,这下通俗易懂了吧!

示例:

#include <iostream>int a = 0;int main(){
}

上面的变量a所在的作用域就是全局作用域。

2.名字空间作用域(namespace scope)

定义在名字空间中的名字,且不在某个语言结构中(比如,一个类或函数),就是名字空间作用域。这里特别注意下不在某个语言结构中这句话,如果在呢?那就是别的作用域了!

示例:

#include <iostream>namespace WebCore {int a = 0;
}int main() {std::cout << "Hello, World!" << std::endl;std::cout << "a: "<<WebCore::a<< std::endl;return 0;
}

上面的a所在的作用域就是名字空间作用域。

3.局部作用域(local scope)

如果名字在一个函数内声明(包括函数的参数),则它的作用域就是局部作用域。这里需要特别注意的是函数自己的参数也是局部作用域,和内部定义的名字一样。

示例:

#include <iostream>void test(int a) {int b = 0;
}int main() {std::cout << "Hello, World!" << std::endl;return 0;
}

上面的函数test里面的a和b所在的作用域都是局部作用域。

4.类作用域(class scope)

如果名字是类的一个成员,则它的作用域是为类作用域。这个应该接触的太多了,类里面定义的成员字段和成员函数都是类作用域。

示例:

#include <iostream>class Demo {
private:int a;
public:void print() {}
};int main() {std::cout << "Hello, World!" << std::endl;return 0;
}

类Demo的私有成员a和公有成员print都是类作用域,只不过print这个名字可能不是好名字,大家不要这么命名。

5.语句作用域(statement scope)

名字声明在一个for、while、switch或if语句中的作用域就是语句作用域。
示例:

#include <iostream>int main() {std::cout << "Hello, World!" << std::endl;if (true){int a = 0;}return 0;
}

这句写的很low,if语句必然执行,当然这只是演示,不要太较真。a的作用域就是语句作用域,我们的目的达到了。

三、复杂情况

接着上面的说,如果一个名字即在名字空间中,又在函数中,又在语句中,它属于哪种作用域?
示例:

#include <iostream>int a;//全局作用域namespace WebCore {class Demo {private:int a;//类作用域public:void print() {}//类作用域};int a = 0;//名字空间作用域void test(int a) {//局部作用域int b = a;//局部作用域if (a) {int a = 0;//语句作用域}}
}int main() {std::cout << "Hello, World!" << std::endl;return 0;
}

定义了一堆的a,这或许不是好的命名方式,但是一个好的演示方式。


总结

1、学好C++作用域必须理解透彻,这样才能用好!
2、C++比C多了两个作用域:名字空间作用域和类作用域

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/238281.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

使用Exchanger线程之间交换数据

public class ExchangeThread {static class Producer implements Runnable{//生产者、消费者交换的数据结构private List<String> buffer;//步生产者和消费者的交换对象private Exchanger<List<String>> exchanger;Producer(List<String> buffer,Exch…

MySQL,使用Union组合查询

1、基本使用 Union可将多条select语句组合成一个结果集&#xff0c;常见的使用场景有2种&#xff1a; 在单个查询中&#xff0c;从不同的表返回类似结构的数据&#xff1b;对单个表执行多个查询&#xff0c;按单个查询返回数据。 例&#xff1a;检索出所有价格<50的产品&…

批发订货系统小程序怎么推广 四个方案高效获客

微信小程序基于强社交属性&#xff0c;天然自带引流特性&#xff0c;但毕竟小程序也只是一个工具&#xff0c;想要快速获客&#xff0c;还是需要商家主动采取一些措施的。下面分享是个方法&#xff0c;尤其是最后一个&#xff0c;是十分凑效的。大家点个关注点个赞&#xff0c;…

Android 权限申请

在Android中&#xff0c;从Android 6.0&#xff08;API级别23&#xff09;开始&#xff0c;应用在运行时需要动态申请权限。以下是一些步骤来动态申请权限&#xff1a; 在应用的清单文件&#xff08;AndroidManifest.xml&#xff09;中声明需要的权限。例如&#xff0c;如果应…

从零开发短视频电商 在AWS上用SageMaker部署自定义模型

文章目录 简介使用model.tar.gz1.从huggingface上下载模型2.自定义代码3.打包为tar 文件4.上传model.tar.gz到S35.部署推理 使用hub1.在sagemaker上新建个jupyterlab2.上传官方示例ipynb文件3.指定HF_MODEL_ID和HF_TASK进行部署和推理 inference.py官方示例 简介 原始链接&…

Mysql的基础问题原理

存储引擎&#xff1a; 存储引擎是Inndb。它支持行级锁&#xff0c;以及表级锁&#xff0c; 支持事务操作&#xff0c; 需要主键&#xff0c;若未声明主键&#xff0c;则会寻找表中的 not null 以及 unique 修饰的字段。若表中无此类字段&#xff0c;会隐式生成字段。 索引&…

解决win10下强制设置web浏览器为microsoft edge的方法

目录 问题场景实现方法禁止edge默认选项设置默认浏览器 反思 问题场景 因为一些特殊的原因&#xff0c;我需要第二个浏览器&#xff0c;我的第一个浏览器是google的chrome浏览器&#xff0c;所以我选择的是windows的默认浏览器&#xff0c;就是microsoft edge浏览器&#xff0…

UI Grounding 学习笔记

学习资料 【OpenMMLab社区开放麦讲座】《颠覆性创新&#xff1a;多模态对话与精准区域分割 - VPGTrans & NExT-Chat》 1. 学术关键字 LLM Detection 2. 相关论文 InstructBLIP&#xff1a;指令微调RT-DETRVPGTrans: Transfer Visual Prompt Generator across LLMs (Ne…

【Java】Mybatis

MyBatis JavaEE三层框架&#xff1a;表现层、业务层、持久层。 现在开始学习持久层。持久层就是负责与数据库打交道的代码。 框架&#xff1a;就是一个半成品软件。在框架的基础上&#xff0c;可以更加高效地写出代码。 1、MyBatis快速入门 1、准备工作&#xff08;创建sp…

SpringMVC配置文件

springMVC-servlet.xml springMVC配置 放在resources下 <?xml version"1.0" encoding"UTF-8"?> <beans xmlns"http://www.springframework.org/schema/beans"xmlns:context"http://www.springframework.org/schema/context&quo…

【大模型】快速体验百度智能云千帆AppBuilder搭建知识库与小助手

文章目录 前言千帆AppBuilder什么是千帆AppBuilderAppBuilder能做什么 体验千帆AppBuilderJava知识库高考作文小助手 总结 前言 前天&#xff0c;在【百度智能云智算大会】上&#xff0c;百度智能云千帆AppBuilder正式开放服务。这是一个AI原生应用开发工作台&#xff0c;可以…

【C++入门到精通】互斥锁 (Mutex) C++11 [ C++入门 ]

阅读导航 引言一、Mutex的简介二、Mutex的种类1. std::mutex &#xff08;基本互斥锁&#xff09;2. std::recursive_mutex &#xff08;递归互斥锁&#xff09;3. std::timed_mutex &#xff08;限时等待互斥锁&#xff09;4. std::recursive_timed_mutex &#xff08;限时等待…

【沁恒蓝牙mesh】CH58x DataFlash 详解

本文主要介绍了 沁恒蓝牙芯片 CH58x 的 DataFlash 分区以及读写操作以及原理 &#x1f4cb; 个人简介 &#x1f496; 作者简介&#xff1a;大家好&#xff0c;我是喜欢记录零碎知识点的小菜鸟。&#x1f60e;&#x1f4dd; 个人主页&#xff1a;欢迎访问我的 Ethernet_Comm 博…

Oracle重建索引详解

更新&#xff1a;2023-05-17 18:08 一、Oracle重建索引命令 Oracle重建索引可以通过ALTER INDEX命令来完成。下面是示例代码&#xff1a; ALTER INDEX index_name REBUILD [PARAMETERS];其中&#xff0c;index_name是需要重建的索引名称&#xff0c;PARAMETERS是可选的重建参…

CUMT--Java复习--JDBC编程

目录 一、JDBC简介 二、数据库访问 1、加载数据库驱动 2、建立数据连接 3、创建Statement对象 4、执行SQL语句 5、访问结果集 三、MetaData接口 1、DatabaseMetaData接口 2、ResultSetMetaData接口 四、事务 1、JDBC中的事务 2、保存点 3、批量更新 一、JDBC简…

【LeetCode】459. 重复的子字符串(KMP2.0)

今日学习的文章链接和视频链接 leetcode题目地址&#xff1a;459. 重复的子字符串 代码随想录题解地址&#xff1a;代码随想录 题目简介 给定一个非空的字符串 s &#xff0c;检查是否可以通过由它的一个子串重复多次构成。 看到题目的第一想法(可以贴代码&#xff09; 1.…

韵达快递查询入口,一键将退回件筛选出来

批量查询韵达快递单号的物流信息&#xff0c;并将退回件一键筛选出来。 所需工具&#xff1a; 一个【快递批量查询高手】软件 韵达快递单号若干 操作步骤&#xff1a; 步骤1&#xff1a;运行【快递批量查询高手】软件&#xff0c;并登录 步骤2&#xff1a;点击主界面左上角的…

CSS-SVG-环形进度条

线上代码地址 <div class"circular-progress-bar"><svg><circle class"circle-bg" /><circle class"circle-progress" style"stroke-dasharray: calc(2 * 3.1415 * var(--r) * (var(--percent) / 100)), 1000" …

影响晶振频率稳定性的因素及解决方法

晶振作为电子设备中的核心元件&#xff0c;其频率稳定性对设备的性能和可靠性具有重要影响。晶发电子将介绍影响晶振频率稳定性的因素&#xff0c;并探讨相应的解决方法。 一、影响晶振频率稳定性的因素 频率&#xff1a;晶振的频率是影响其性能的最重要因素之一。在选择晶振…

初识Docker-什么是docker

Docker是一个快速交付应用、运行应用的技术 目录 一、Docker 二、运用场景 一、什么是Docker&#xff1f;它的作用是什么&#xff1f; Docker如何解决大型项目依赖关系复杂&#xff0c;不同组件依赖的兼容性问题? Docker允许开发中将应用、依赖、函数库、配置一起打包&…