Namespace 命名空间的使用

news2025/6/3 11:59:34

名字空间:划分更多的逻辑空间,有效避免名字冲突的问题

1.什么是命名空间

名字命名空间 namespace 名字空间名 {...}

// 名字空间 n1 域
namespace n1 {

    // 全局变量
    int g_money = 0;

    void save(int money)
    {
        g_money += money;
    }

    void pay(int money)
    {
        g_money -= money;
    }
}
2.名字空间合并

名字命名空间 namespace 名字空间名 {...}

名字命名空间 namespace 名字空间名 {...}

编译器会自动将多个名字相同的命名空间合并为一个名字空间

namespace n1 {

    // 全局变量
    int g_money = 0;

    void save(int money)
    {
        g_money += money;
    }
}
namespace n1 {
    
 	void pay(int money)
    {
        g_money -= money;
    }
}
3.名字空间声明函数

在命名空间内声明函数,但是在外面定义函数

namespace n3 {

    // 全局变量
    int g_money = 0;

    void save(int money)   // 声明并定义
    {
        g_money += money;
    }
    
    void pay(int money);   //  声明
}

void n3::pay(int money)  // 定义
{
    g_money -= money;
}
4.如何使用命名空间呢?(3种)
1) 作用域限定符::
namespace ns {

    int g_val = 0;
}

cout << "ns::g_val = " << ns::g_val << endl;
2)名字空间指令
namespace ns {

    int g_val = 0;
}

using namespace ns;  // 从这行代码开始,ns中的内容在当前作用域可见 -->可见表

g_val = 100;

cout << "g_val = " << g_val << endl;

如果命名空间和main方法中都有g_val变量,它具体使用哪一个变量呢

namespace ns {

    int g_val = 0;
}

int main() {

    int g_val = 5;  // 定义表

    using namespace ns;

    g_val = 100;

    cout << "g_val = " << g_val << endl;  // 100  这里找到的是局部变量int g_val = 5; 

    cout << "ns::g_val = " << ns::g_val << endl;  // 0
    
}

此时namespace ns的 int g_val = 0; 和 全局变量 int g_val = 5;会冲突,定义了两个全局变量

namespace ns {

    int g_val = 0;
}

int g_val = 5;  // 全局变量,出现在 可见表

int main() {

    using namespace ns;

    g_val = 100;

    cout << "g_val = " << g_val << endl;

    cout << "ns::g_val = " << ns::g_val << endl;
    
}

此时namespace ns的 int g_val = 0; 和 全局变量 int g_val = 5;会冲突,定义了两个全局变量

此时namespace ns的 int g_val = 0; 和 全局变量 int g_val = 5;会冲突,定义了两个全局变量

namespace ns {

    int g_val = 0;
}

int g_val = 5;

using namespace ns;

int main() {

    g_val = 100;

    cout << "g_val = " << g_val << endl;

    cout << "ns::g_val = " << ns::g_val << endl;
    
}

3) 名字空间声明
namespace ns {

    int g_val = 0;
}

int main() { 
    
    // 名字空间声明
    using ns::g_val;  //  从这行开始,ns中的g_val引入当前作用域(相当于定义在main函数里)

    g_val = 35;

    cout << "g_val = " << g_val << endl;  // g_val = 35

    cout << "ns::g_val = " << ns::g_val << endl;  // ns::g_val = 35
    
}

如果再定义一个局部变量,就会报重复定义的错误 重定义;多次初始化

namespace ns {

    int g_val = 0;
}

int main() {

    // 名字空间声明
    using ns::g_val; // 从这行开始,ns中的g_val引入当前作用域(相当于定义在main函数里)

    int g_val = 3; // 	“ns::g_val”: 重定义;多次初始化	ProjectDemo0525			

    g_val = 35;
    
    cout << "g_val = " << g_val << endl;

    cout << "ns::g_val = " << ns::g_val << endl;

}

如果再定义一个局部变量,就会报重复定义的错误 重复声明

namespace ns {

    int g_val = 0;
}

int main() {

    int g_val;

    // 名字空间声明
    using ns::g_val; // 从这行开始,ns中的g_val引入当前作用域(相当于定义在main函数里)

    
    g_val = 35;
    
    cout << "g_val = " << g_val << endl;

    cout << "ns::g_val = " << ns::g_val << endl;
    
}

题目一 下面输出什么内容? 哪个命名空间里的值?
namespace ns1 {
    int m_val = 0;
    int m_other = 0;
}

namespace ns2 {
    int m_val = 0;
    int m_other = 0;
}

int main()
{
    using namespace ns1; //名字空间指令,ns1中的所有内容在当前作用域可见(可见表)

	using ns2::m_val; // 名字空间声明,ns2中的m_val引入当前作用域(定义表),仅仅只有m_val出现在定义表中

	m_val = 50;

	cout << "ns1::m_val = " << ns1::m_val << endl;  // 0
	cout << "ns2::m_val = " << ns2::m_val << endl;  // 50

	m_other = 35;

	cout << "ns1::m_other = " << ns1::m_other << endl;  // 35
	cout << "ns2::m_other = " << ns2::m_other << endl;  // 0
    
    
}

猜对了么? 输出的是 ns2::m_val 和 ns1::m_other 有值

using namespace ns1; //名字空间指令,ns1中的所有内容在当前作用域可见(可见表)

using ns2::m_val;; //名字空间声明,ns2中的m_val引入当前作用域(定义表),仅仅只有m_val出现在定义表中

5.1 名字空间嵌套

namespace md1 {
    namespace md2 {
        namespace md3 {
            namespace md4 {
                int f = 30;
            }
        }
    }
}

int main() {

    cout << md1::md2::md3::md4::f << endl;  // 30
    
}

名字空间别名可以简化书写

namespace md_four = md1::md2::md3::md4;

cout << md_four::f << endl;  // 30

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

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

相关文章

mac 下安装Rust Toolchain(Nightly)

你可以用 Homebrew 安装 rustup&#xff0c;这是推荐的管理 Rust toolchain的 brew install rustup-init安装 Rust&#xff08;包含 rustup&#xff09; rustup-init安装过程中会让你选择安装那个&#xff0c;直接回车选择默认的即可 安装完成后&#xff0c;cargo, rustc, r…

学习STC51单片机22(芯片为STC89C52RCRC)

记住这个AT指令千万不要去脑子记&#xff0c;要用手册查 每日一言 努力不是为了感动谁&#xff0c;而是为了不辜负自己的野心。 硬件&#xff1a;ESP8266 wife模块 蓝牙&#xff0c;ESP-01s&#xff0c;Zigbee&#xff0c;NB-lot等通信模块都是基于AT指令的设计 老样子 我们用…

Linux --UDP套接字实现简单的网络聊天室

一、Server端的实现 1.1、服务端的初始化 ①、创建套接字&#xff1a; 创建套接字接口&#xff1a; #include <sys/types.h> /* See NOTES */ #include <sys/socket.h> int socket(int domain, int type, int protocol); //1. 这是一个创建套接字的接…

word批量导出visio图

具体步骤 修改word格式打开VBA窗口插入代码运行代码 修改word格式 将word文档修改为docm格式 打开VBA窗口 打开开发工具VisualBasic项&#xff0c;如果没有右键在自定义功能区添加 插入代码 插入 -> 模块&#xff0c;代码如下&#xff1a; Sub ExportAllVisioDiagrams()D…

【本地部署】 Deepseek+Dify创建工作流

文章目录 DeepseekDify 简介流程1、下载Docker2、Dify下载3、使用浏览器打开 Deepseek Deepseek 是一款功能强大的 AI 语言模型工具&#xff0c;具备出色的理解与生成能力。它可以处理各种自然语言任务&#xff0c;无论是文本创作、问答&#xff0c;还是数据分析与解释&#x…

数据结构-图的应用,实现环形校验和拓扑排序

文章目录 一、如何理解“图”&#xff1f;1.什么是图&#xff1f;2.无向图和有向图3.无权图和有权图 二、JGraphT-图论数据结构和算法的 Java 库1.引入Maven依赖2.环形校验2.1 什么是循环依赖 &#xff1f;2.2 单元测试代码2.3 情况1&#xff1a;自己依赖自己2.4 情况2&#xf…

某乎x-zse-96 破解(补环境版本)

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 一、总体概述二、请求分析分析请求流程三、逆向分析总结一、总体概述 本文主要实现某乎x-zse-96 破解(补环境版本),相关的链接: https://www.zhihu.com/search?type=content&q=%25E7%258…

VSCode+Cline 安装配置及使用说明

安装配置 打开VSCode&#xff0c;点击左侧Extension图标&#xff0c;在弹出页面中&#xff0c;检索Cline&#xff0c;选择Cline进行安装。 安装完毕&#xff0c;在左侧会出现一个图标&#xff0c;点击图标 选择【Use your own API key】&#xff0c;在出来的界面中选择大模型&…

Maven 安装与配置指南(适用于 Windows、Linux 和 macOS)

Apache Maven 是一款广泛应用于 Java 项目的项目管理和构建工具。 本文提供在 Windows、Linux 和 macOS 系统上安装与配置 Maven 的详细步骤&#xff0c;旨在帮助开发者快速搭建高效的构建环境。 一、前置条件&#xff1a;安装 Java Development Kit (JDK) Maven 依赖于 Java …

android 媒体框架之MediaCodec

一、MediaCodec 整体架构与设计思想 MediaCodec 是 Android 底层多媒体框架的核心组件&#xff0c;负责高效处理音视频编解码任务。其架构采用 生产者-消费者模型&#xff0c;通过双缓冲区队列&#xff08;输入/输出&#xff09;实现异步数据处理&#xff1a; 输入缓冲区队列…

堆与堆排序及 Top-K 问题解析:从原理到实践

一、堆的本质与核心特性 堆是一种基于完全二叉树的数据结构&#xff0c;其核心特性为父节点与子节点的数值关系&#xff0c;分为大堆和小堆两类&#xff1a; 大堆&#xff1a;每个父节点的值均大于或等于其子节点的值&#xff0c;堆顶元素为最大值。如: 小堆&#xff1a;每个…

软件锁:守护隐私,安心无忧

数字化时代&#xff0c;手机已成为我们生活中不可或缺的一部分&#xff0c;它不仅存储着我们的个人信息、照片、聊天记录等重要数据&#xff0c;还承载着我们的社交、娱乐和工作等多种功能。然而&#xff0c;这也意味着手机上的隐私信息面临着诸多泄露风险。无论是家人、朋友还…

无人机桥梁3D建模、巡检、检测的航线规划

无人机桥梁3D建模、巡检、检测的航线规划 无人机在3D建模、巡检和检测任务中的航线规划存在显著差异&#xff0c;主要体现在飞行高度、航线模式、精度要求和传感器配置等方面。以下是三者的详细对比分析&#xff1a; 1. 核心目标差异 任务类型主要目标典型应用场景3D建模 生成…

【Java基础05】面向对象01

文章目录 1. 设计对象并使用1.1 类与对象1.2 封装1.2.1 private关键字1.2.2 this关键字成员变量和局部变量的区别 1.2.3 构造方法1.2.4 标准JavaBean类 1.3 对象内存图 本文部分参考这篇博客 1. 设计对象并使用 1.1 类与对象 public class 类名{1、成员变量(代表属性,一般是名…

设计模式:观察者模式 - 实战

一、观察者模式场景 1.1 什么是观察者模式&#xff1f; 观察者模式&#xff08;Observer Pattern&#xff09;观察者模式是一种行为型设计模式&#xff0c;用于定义一种一对多的依赖关系&#xff0c;当对象的状态发生变化时&#xff0c;所有依赖于它的对象都会自动收到通知并更…

YOLOv8 移动端升级:借助 GhostNetv2 主干网络,实现高效特征提取

文章目录 引言GhostNetv2概述GhostNet回顾GhostNetv2创新 YOLOv8主干网络改进原YOLOv8主干分析GhostNetv2主干替换方案整体架构设计关键模块实现 完整主干网络实现YOLOv8集成与训练模型集成训练技巧 性能对比与分析计算复杂度对比优势分析 部署优化建议结论与展望 引言 目标检…

国产化Word处理控件Spire.Doc教程:在 C# 中打印 Word 文档终极指南

在 C# 中以编程方式打印 Word 文档可以简化业务工作流程、自动化报告和增强文档管理系统。本指南全面探讨如何使用Spire.Doc for .NET打印 Word 文档&#xff0c;涵盖从基本打印到高级自定义技术的所有内容。我们将逐步介绍每种情况下的实际代码示例&#xff0c;确保您能够在实…

谷歌:贝叶斯框架优化LLM推理反思

&#x1f4d6;标题&#xff1a;Beyond Markovian: Reflective Exploration via Bayes-Adaptive RL for LLM Reasoning &#x1f310;来源&#xff1a;arXiv, 2505.20561 &#x1f31f;摘要 通过强化学习 (RL) 训练的大型语言模型 (LLM) 表现出强大的推理能力和紧急反射行为&a…

Qt SQL模块基础

Qt SQL模块基础 一、Qt SQL模块支持的数据库 官方帮助文档中的Qt支持的数据库驱动如下图&#xff1a; Qt SQL 模块中提供了一些常见的数据库驱动&#xff0c;包括网络型数据库&#xff0c;如Qracle、MS SQL Server、MySQL等&#xff0c;也包括简单的单机型数据库。 Qt SQL支…

[9-3] 串口发送串口发送+接收 江协科技学习笔记(26个知识点)

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26中断