C++命名空间概述

news2024/11/24 15:32:34
        c++的命名空间是为了解决重名的问题的,试想这样一个场景,我写了一个函数叫做copy()用来处理一些 can 数据的拷贝,但是在工程的其他位置有一个和我名字一模一样的函数是用来处理其他数据的拷贝,这个时候两个函数名就冲突了,当然不止是函数,有些时候我们定义的一些变量名,类名啥的都可能会存在重复的情况。面对这样的问题的时候,我们可以应用命名空间 来解决这些问题,我们通常把可能重复的一些东西写在自定义的命名空间中,命名空间会为里面的这些函数,类,变量附加一些上下文信息从而取分,就像是一个文件夹下不能 存在两个相同名字的文件,那我们可以建立一个文件夹然后在这个文件夹下放入我们的文件, 命名空间就相当于这个新建的文件夹。

定义命名空间(namespace)

使用 namespace 关键字可以定义一个名字空间,例如:
#include<iostream>
using namespace std;
namespace jiuyue
{
    int a = 8; //定义变量
    class demo //定义类
    {
        private:
            int b;
        public:
            demo(){b=0;};
            ~demo(){};
            int A(int x){return x;}
    };
    int B() //定义函数
    {
        return 10;
    }
    namespace qiyue //定义名字空间
    {
        int c;
    }
}

int main(int argc, char const *argv[])
{
    jiuyue::a = 10; //使用 jiuyue 里面的变量
    cout<<jiuyue::B()<<endl; //使用 jiuyue 里面的函数
    jiuyue::demo s;
    cout<<s.A(9)<<endl; //使用 jiuyue 里面的类
    jiuyue::qiyue::c = 2; //使用 jiuyue 里面的名字空间
    return 0;
}
        我们定义一个名字空间为 jiuyue,我们可以在里面去定义和初始化变量,类和函数,也可以定 义名字空间,在使用的时候我们使用作用域符号::去索引我们名字空间中的这些内容就可以使用 了。

引用命名空间(using)

        using 关键字可以对命名空间进行引用,比如有一个主文件夹,也就是我们的主进程空间,里面有一个子文件夹 叫 sdt,也就是我们的 std 名字空间,std 这个子文件夹中有一个 cin 文件,一般我们是没法直接在主文件夹是没法 cin 的,而要进入 std 子文件夹中去使用它,也就是我们在使用 cin 的时候需要 std::cin 去索引它,而 using 的作用就是可以将这些子文件中的东西拷贝到主文件中,也就是可以不使用作用域符::去索引就可以使用名字空间中的东西。
#include<iostream>
int main(int argc, char const *argv[])
{
    // cout<<"hello word"<<endl; //错误
    std::cout<<"hello word"<<std::endl; //正确
    return 0;
}
        如下图,如果直接访问 std 名字空间中的 cout 和 endl 是会报错的,因为没法找到它,所以要 使用作用域符::去用名字空间索引它才能使用,但是可以通过 using 将这个名字空间的对象拷贝到当前作用域上,那么在使用时就不需要使用名字空间去索引了,如下。
#include<iostream>
using std::cout;
using std::endl;
int main(int argc, char const *argv[])
{
    cout<<"hello word"<<endl; //不会报错
    return 0;
}
我们经常看到类型下面这样的用法:
using namespace std;
        这样的写法确实就是将整个名字空间的内容全部引入到当前作用域,这样做在初学 c++的时候不会有什么问题,可以方便我们直接使用 std 名字空间里面的东西,但是在工作工程中尽量不
要这样使用,将整个名字空间的内容引入无疑会大大加大名字的重复性,反而就让我们的名字空间失去了意义.

匿名名字空间

        匿名名字空间提供了类似在全局函数前加 static 修饰带来的限制作用域的功能。比如,在两个源文件中定义了相同的全局变量(或函数),就会发生重定义的错误。如果将它们声明为全局静态变量(函数)就可以避免重定义错误。在 C++中,除了可以使用 static 关键字避免全局变量(函数)的重定义错误,还可以通过匿名名字空间的方式实现。例如
//1.cpp
#include<iostream>
int dev = 10;
extern void fun();
int main(int argc, char const *argv[])
{
    std::cout << dev <<std::endl;
    //void fun();
    fun();
    return 0;
}
//2.cpp
#include<iostream>
namespace
{
    int dev = 0;
};
void fun(){std::cout<<dev<<std::endl;}

        未命名的名字空间中定义的变量(或函数)只在包含该名字空间的文件中可见,但其中的变量的生存期却从程序开始到程序结束。如果有多个文件包含未命名的名字空间,这些名字空间是不相关的,即使这些名字空间中定义了同名的变量(函数),这些标识符也代表不同的对象。也就是说我在头文件中定义了一个匿名空间,那么包含这个匿名空间的文件将都会获得这个匿名空间里的对象,但是都是独立的静态对象。

注意事项

1. 一个名字空间可以在多个头文件或源文件中实现,成为分段定义。如果想在当前文件访问定义在另一个文件中的同名名字空间内的成员变量,需要在当前文件的名字空间内部进行申明。如标准 C++ 库中的所有组件都是在一个被称为 std 的名字空间中声明和定义的。这些组件当然分散在不同的头文件和源文件中。
2. 名字空间内部可以定义类型、函数、变量等内容,但名字空间不能定义在类和函数的内部。
3. 在一个名字空间中可以自由地访问另一个名字空间的内容,因为名字空间并没有保护级别的限制。
4. 不能在名字空间的定义中声明另一个嵌套的子命名空间,只能在命名空间中定义子命名空间。也就是你可以在名字空间中定义一个名字空间,但是不能声明一个名字空间
5. 名字空间的成员,可以在命名空间的内部定义,也可以在名字空间的外部定义,但是要在名字空间进行声明。
6. 名字空间在进行分段定义时,不能定义同名的变量,否则连接出现重定义错误。因为名字空间不同于类,具有外部连接的特性。由于外部连接特性,请不要将名字空间定义在头文件,因为当被不同的源文件包含时,会出现重定义的错误。
7. 为了避免命名空间的名字与其他的命名空间同名,可以用较长的标识符作为命名空间的名字。但是书写较长的命名空间名时,有些冗余,因此,我们可以在特定的上下文环境中给命名空间起一个相对简单的别名。 例如
namespace MyNewlyCreatedSpace{
    void show(){
    std::cout<<"a function within a namespace"<<std::endl;
    }
}
int main(int argc,char* argv[])
{
    namespace sp=MyNewlyCreatedSpace;
    sp::show();
}

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

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

相关文章

项目资源不足,常见的5种处理方式

软件开发中&#xff0c;经常会遇到项目资源不足的情况&#xff0c;项目团队如果无法及时获得所需的人力、财力、物力等资源&#xff0c;往往会影响团队士气以及任务质量&#xff0c;造成无法按时完成任务&#xff0c;进而影响项目进度。 因此及时处理和应对资源不足的情况&…

宽带电力载波稳定吗?有丢数据吗?

随着我国智能电网建设的推进&#xff0c;宽带电力载波技术作为一种集电力传输与信息通信于一体的技术&#xff0c;得到了广泛关注。然而&#xff0c;宽带电力载波通信在实际应用过程中&#xff0c;稳定性问题及数据丢失现象成为制约其发展的瓶颈。为了进一步提高宽带电力载波的…

金融配置知识:为什么融资加杠杆股票涨跌不一样

在金融市场&#xff0c;融资加杠杆是一种常见的投资策略&#xff0c;它允许投资者使用较少的自有资金来控制更大的投资额度。然而&#xff0c;融资加杠杆的股票涨跌表现可能会与投资者预期的不同&#xff0c;这主要是由以下几个因素造成的&#xff1a; 1. 杠杆效应&#xff1a;…

使用 .NET MAUI 和 Evergine 构建 3D 应用程序和内容

作者&#xff1a;Jorge Canton Ferrero 排版&#xff1a;Alan Wang 这是来自 Plain Concepts 的 Jorge Canton 的客座博客文章。Jorge 是技术初创公司 Syderis 的联合创始人&#xff0c;12 年来一直致力于计算机图形、游戏引擎和图形工具领域的开发。目前&#xff0c;他担任 Pl…

工作事项太多如何合理安排事项?

不论您所从事的时哪个行业&#xff1f;每天总是会有很多事情需要处理&#xff0c;很多人在职场中都是忙得焦头烂额&#xff0c;甚至有时候还会因工作的交叉性出现不能按时完成重要的工作任务&#xff0c;这时候大家就需要合理安排工作事项&#xff0c;并借助一些工具督促工作任…

ChatGPT AI工具盘点:国内外推荐的AI人工智能聊天机器人工具

Chatgpt作为一个重要的人工智能对话工具&#xff0c;给人们的日常生活和工作带来了很多便利和创新&#xff0c;现在更是被应用于各种领域&#xff0c;从2015年12月Openai公司成立&#xff0c;直到2022年12年GPT-3的正式发布&#xff0c;Chatgpt才正式进入大众的视野&#xff0c…

【MySQL数据库】 三

本文主要介绍了mysql的数据增加操作和查询操作. SQL最核心的就是增删改查(CRUD) * c create * r read * u update * d delete 一.新增 1.往数据表中插入一条数据 insert into 表名 values( 值 ,值 , ….) ; 2.插入中文 3.指定列插入 4.一次插…

十分钟设置免费海外远程桌面 | 使用Amazon Lightsail服务的免费套餐轻松搭建远程桌面

目录 使用Amazon Lightsail服务的免费套餐轻松搭建远程桌面 1. 启动Amazon Lightsail实例 2. 配置远程桌面 3. 启动远程桌面 4. 使用远程桌面 使用Amazon Lightsail服务的免费套餐轻松搭建远程桌面 前言 ①本教程将向您介绍如何使用Amazon Lightsail服务的免费套餐轻松搭…

使用工具+迅雷解决ESP32配置下载问题

因为一些原因下载git上内容相当缓慢或都根本无法下载所以写了一个工具获取链接并使用迅雷下载。 工具下载&#xff1a;【免费】使用迅雷下载开发板工具资源-CSDN文库

【STM32】基于HAL库建立自己的低功耗模式配置库(STM32L4系列低功耗所有配置汇总)

【STM32】基于HAL库建立自己的低功耗模式配置库&#xff08;STM32L4系列低功耗所有配置汇总&#xff09; 文章目录 低功耗模式&#xff08;此章节可直接跳过&#xff09;低功耗模式简介睡眠模式停止模式待机模式 建立自己的低功耗模式配置库通过结构体的方式来进行传参RTC配置…

高等数学啃书汇总重难点(十二)无穷级数

同济高数的最后一张&#xff0c;重点是各种审敛法&#xff0c;至于后面的傅里叶级数和泰勒级数等&#xff0c;期末考试一般不会考&#xff08;很多学校都不学&#xff09;&#xff0c;奈何数学一的考纲里面有&#xff0c;就捎带提一嘴。。。学会判别特定级数的敛散性是这一章的…

面试算法51:节点值之和最大的路径

题目 在二叉树中将路径定义为顺着节点之间的连接从任意一个节点开始到达任意一个节点所经过的所有节点。路径中至少包含一个节点&#xff0c;不一定经过二叉树的根节点&#xff0c;也不一定经过叶节点。给定非空的一棵二叉树&#xff0c;请求出二叉树所有路径上节点值之和的最…

机器学习 - 加油站数据分析

一、实验数据 数据集&#xff1a;“加油站数据.xls” 数据集介绍&#xff1a;该表记录了用户在11月和12月一天24小时内的加油信息&#xff0c;包括&#xff1a;持卡人标识&#xff08;cardholder&#xff09;、卡号&#xff08;cardno&#xff09;、加油站网点号&#xff08;n…

React Native 样式及其布局

React Native 样式及其布局 参考 https://reactnative.cn/docs/flexbox 一、样式 在 React Native 中&#xff0c;你并不需要学习什么特殊的语法来定义样式。我们仍然是使用 JavaScript 来写样式。所有的核心组件都接受名为style的属性。这些样式名基本上是遵循了 web 上的 …

液滴微流控,助力国人单细胞

单细胞RNA测序&#xff08;scRNA-seq&#xff09;技术已经成为揭示单个细胞内RNA转录本的异质性和复杂性&#xff0c;以及揭示组织/器官/生物体内不同细胞类型的组成和功能的最先进的方法。迄今为止&#xff0c;单细胞RNA测序技术已经在动植物等真核细胞中取得了许多重要的发现…

【Python基础】IF、Else判断以及Whlie、for循环介绍符实例

运算符 1. if 语句体验2.逻辑运算3. if 语句进阶4.While循环4.1基本语法 5.break 和 continue6. for循环 1. if 语句体验 if 判断语句基本语法 在 Python 中&#xff0c;if 语句 就是用来进行判断的&#xff0c;格式如下&#xff1a; if 要判断的条件: 条件成立时&#xff0c;…

EasyCVR智能边缘网关用户信息泄漏漏洞

EasyCVR智能边缘网关用户信息泄漏漏洞 免责声明漏洞描述漏洞影响漏洞危害网络测绘Fofa: title"EasyCVR" 漏洞复现1. 构造poc2. 获取管理员账户密码3. 登录后台 免责声明 仅用于技术交流,目的是向相关安全人员展示漏洞利用方式,以便更好地提高网络安全意识和技术水平…

车载终端构筑智慧工厂:无人配送车的高效物流体系

​随着科技的不断进步和应用&#xff0c;智能化已经成为许多领域的关键词。在物流行业中&#xff0c;随着无人配送车的兴起和智慧工厂的崛起&#xff0c;车载终端正引领着无人配送车的科技变革之路。 文章同款&#xff1a;https://www.key-iot.com/iotlist/sv900.html 车载终端…

springboot+vue基于hive旅游数据的分析与应用【内含源码+文档+部署教程】

博主介绍&#xff1a;✌全网粉丝10W,前互联网大厂软件研发、集结硕博英豪成立工作室。专注于计算机相关专业毕业设计项目实战6年之久&#xff0c;选择我们就是选择放心、选择安心毕业✌ &#x1f345;由于篇幅限制&#xff0c;想要获取完整文章或者源码&#xff0c;或者代做&am…

成本中心修改后推送其他SAP系统更新成本中心(ALE)

成本中心修改后推送给其他系统 KSH2成本中心组新增成本中心&#xff08;服务器A 400client&#xff09; KAVB 输入成本中心组、控制范围、目标系统 Y 查看&#xff08;服务器B 430client&#xff09;