C++命名空间(详解)

C++基础语法

C++基于C语言的改进:c++在C语言的基础上引入并扩充了面向对象的概念

C++基础概念C++是基于C语言而产生的,它即可以进行C语言的过程化程序设计,又可以进行以抽象数据类型为特点的基于对象的程序设计,还可以进行面向对象的程序设计

在1998年 出现C++98 C++成熟 他是标准第一个版本 引入了STL 标准模板库

C++总共63个关键字,其中包括C语言关键字32个


1.命名空间

在C/C++中,变量、函数和后面要学到的类都是大量存在的,这些变量、函数和类的名称将都存在于全局作用域中,可能会导致很多冲突。使用命名空间的目的是对标识符的名称进行本地化,以避免命名冲突或名字污染,namespace关键字的出现就是针对这种问题的。

这是C语言一个缺点:

例如:

//使用rand定义一个全局变量 没有问题 输出0
int rand = 0;

int main()
{
    printf("%d ", rand);
    return 0;
}

如果引用头文件stdlib rand是个函数 导致命名冲突 编译失败

假如:日常你使用一个变量名称 你不知道他是库函数中的函数 那么会导致命名冲突

命名空间用来做名字隔离 防止命名冲突

如果没有命名空间 如果名字冲突了 整个项目上千个名字 改起来很麻烦

如果以后去公司 分组完成一个项目 单独写都没有问题 很多小组难免会命名冲突,我们该如何避免这种状况

如果是C语言的话 只能商量一下 两个人其中的一个人被迫修改名字

但是C++有方式解决方式,引入命名空间 新增关键字 namespace

命名空间的定义

定义命名空间,需要使用到namespace关键字,后面跟命名空间的名字,然后接一对{}即可,{}中即为命名

普通的命名空间:

例如:

#include <iostream>
namespace zhr
{
    int a = 0;
}

namespace后面可以定义一个名字 这个名字就是域

命名空间定义的是命名空间域

命名空间域的变量生命周期是全局,但是它属于该命名空间域

C语言早早就接触过 同一个域不可以定义同一个变量 不同的域可以定义相同的变量

域会影响访问和生命周期

: :  域作用限定符 指定从域作用限定符左边的域去找 如果左边的域是空白 表示全局域 去全局域找

#include <stdio.h>
namespace bit
{
    int a = 2;
}
int a  = 1;
int main()
{
    int a = 0;
    printf("%d\n",a);//在局部范围找  输出结果是0
    printf("%d\n", bit::a);//指定命名空间域去找 输出结果是2
    //如果非要访问全局变量中的a呢?  
    printf("%d\n",::a);//域作用限定符;  输出结果是1
    return 0;
}

会输出局部变量的a 局部优先 就近原则 像访问局部 局部没有 再去全局变量中找

命名空间不只是可以定义变量 还可以定义函数 结构体

直接调用调用不到函数 命名空间是函数找的规则 默认在全局变量去找 默认不会在命名空间去找 必须指定才会去找

namespace bit
{
    int rand = 0;
    void func()
    {
        printf("func()\n");n 
    }

    struct TreeNode
    {
        struct TreeNode* left;
        struct TreeNode* right;
        int val;
    };
}

int main()
{
        func();//直接调用是调用不到的
    bit::func();//只需要在func前加bit::就可以调用到了

    struct TreeNode node;//这里也同理
        struct bit::TreeNode node;//但是这里命名空间要放在结构体名称前面
    return 0;
}

命名空间可以嵌套

#include <iostream>

namespace hhh
{
    namespace zhr
    {
        int a = 10086;    
    }
}
int main()
{
    printf("%d\n",hhh::zhr::a);
    return 0;
}

3. 同一个工程中允许存在多个相同名称的命名空间,编译器最后会合成同一个命名空间中

注意:一个命名空间就定义了一个新的作用域,命名空间中的所有内容都局限于该命名空间中

不可以直接调用该命名空间里的变量和函数 需要使用:: 域作用限定符

命名空间的使用有三种方式:

1.加命名空间名称及作用域限定符:

using namespace std;
namespace N
{
    int a = 886;
    int b = 0;
}
int main()
{
    printf("%d\n", N::a);
    return 0;
}

2.使用using将命名空间中成员引入

using namespace std;
namespace N
{
    int a = 886;
    int b = 520;
}
using N::b;
int main()
{
    printf("%d\n", N::a);
    printf("%d\n", b);
    return 0;
}

3.使用using namespace 命名空间名称引入

using namespace std;

namespace N
{
    int a = 886;
    int b = 520;
    int c = 666;
}
using namespace N;

using N::b;
int main()
{
    printf("%d\n", a);
    printf("%d\n", b);
    printf("%d\n", c);
    return 0;
}

使用命名空间的建议

1.项目中尽量不用using namespace std;

std是标准库的命名空间

2.日常练习用using namespace std;

3.项目中,指定命名空间访问+展开常用的

2.C++输入&输出

C++的第一个代码:hello World

知道了命名空间 这回知道了每次写C++代码前都要加

using namespace std;std是C++标准库的命名空间

如果直接展开std 会把库全部暴露出来 在项目中不适用

1.使用cout标准输出(控制台)和cin标准输入(键盘)时,必须包含< iostream >头文件以及std标准命名空间。

注意:早期标准库将所有功能在全局域中实现,声明在.h后缀的头文件中,使用时只需包含对应头文件即可,后来将其实现在std命名空间下,为了和C头文件区分,也为了正确使用命名空间,规定C++头文件不带.h;旧编译器(vc 6.0)中还支格式,后续编译器已不支持,因此推荐使用+std的方式。

2. 使用C++输入输出更方便,不需增加数据格式控制,比如:整形--%d,字符--%c

#include <iosream>

using namespace std;//std是C++标准库的命名空间
int main()
{
    int i, d;
    cin >> i >> d; //流提取
    cout << "Hello World" << endl;//  endl是换行 相当于'\n';
    cout << i << ' ' << d << endl;
    //这里的<<是流插入 自动识别类型
    cout << "hello world" << endl;  //这里相当于把一个char数组流插入到控制台     
    return 0;
}

个人水平不足 如果代码中有错误,可以多多在评论区指出,一定会及时修改!
谢谢大家看到这里 觉得有收获的话可以三连一下 一起加油!

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

文件同步软件,PanguFlow局域网横着走

说到文件同步&#xff0c;它对企业来说及其重要&#xff0c;因为有了文件同步&#xff0c;这个文件数据它才能备份起来&#xff0c;才能用来抵抗自然灾害&#xff0c;比如服务器硬盘损坏了&#xff0c;你要是不备份&#xff0c;这损失可就大了&#xff0c;一款合适的文件同步软…

外星人Alienware X15R1 原厂Windows10系统 oem系统

装后恢复到您开箱的体验界面&#xff0c;包括所有原机所有驱动AWCC、Mydell、office、mcafee等所有预装软件。 最适合您电脑的系统&#xff0c;经厂家手调试最佳状态&#xff0c;性能与功耗直接拉满&#xff0c;体验最原汁原味的系统。 原厂系统下载网址&#xff1a;http://w…

第三方模块的下载与安装

自学python如何成为大佬(目录):https://blog.csdn.net/weixin_67859959/article/details/139049996?spm1001.2014.3001.5501 在进行Python程序开发时&#xff0c;除了可以使用Python内置的标准模块外&#xff0c;还有很多第三方模块可以被我们所使用。对于这些第三方模块&…

欧佩克+同意集体性减产延长,油价能否稳住?

KlipC报道&#xff1a;欧佩克组织同意将延长目前部分减产协议至2025年&#xff0c;以支撑油价。主要成员国把2023年11月宣布的日均220万桶的自愿减产措施延长至今年9月底&#xff0c;将在10月份根据市场情况开始缩减自愿减产规模。 高盛分析师表示&#xff0c;“我们认为这次欧…

成功案例(IF=12.2)| 肠道代谢组、微生物组和脑功能的综合分析揭示了肠-脑轴在长寿中的作用

研究背景 人类长寿是一种受遗传、环境等多种因素影响的复杂表型。近年来&#xff0c;肠道微生物群被认为是长寿的一个重要因素&#xff0c;如Akkermansia、Alisipes和Parabacteroides已被报道与长寿有关。此外&#xff0c;最近的一项研究表明&#xff0c;百岁老人的肠道微生物群…

【前端】政务服务大数据可视化监控平台(源码+html+css+js)

&#x1f449;博__主&#x1f448;&#xff1a;米码收割机 &#x1f449;技__能&#x1f448;&#xff1a;C/Python语言 &#x1f449;公众号&#x1f448;&#xff1a;测试开发自动化【获取源码商业合作】 &#x1f449;荣__誉&#x1f448;&#xff1a;阿里云博客专家博主、5…

以主程序的形式执行

自学python如何成为大佬(目录):https://blog.csdn.net/weixin_67859959/article/details/139049996?spm1001.2014.3001.5501 这里先来创建一个模块&#xff0c;名称为christmastree&#xff0c;该模块的内容为第6章中编写的实例05的代码。在该段代码中&#xff0c;首先定义一…

比试强训介绍以及注意事项

强训不止一次&#xff0c;没有系统学过算法&#xff0c;不要着急参加&#xff0c;容易打击信心。 如何检验算法储备是否足够&#xff1f; 老师码云 检查自己看到每个算法标签时是否掌握下面三个问题&#xff1a; 是什么&#xff1f;如何实现&#xff1f;对应的经典例题能不…

vue3+electron+typescript 项目安装、打包、多平台踩坑记录-mac+linux(包括国产化系统)

上一章《vue3electrontypescript 项目安装、打包、多平台踩坑记录》&#xff0c;我们讲了vue3electrontypescript的项目安装和windows 32位、64位的打包。这一节我们来看下mac和linux平台的打包和一些坑。 mac 经过上一章我们的踩坑后&#xff0c;再到mac环境&#xff0c;这里…

【iOS】UI学习——导航控制器、分栏控制器

UI学习&#xff08;三&#xff09; 导航控制器导航控制器基础导航控制器切换导航栏和工具栏 分栏控制器分栏控制器基础分栏控制器高级 导航控制器 导航控制器负责控制导航栏&#xff08;navigationBar&#xff09;&#xff0c;导航栏上的按钮叫UINavigationItem&#xff08;导航…

数据挖掘API拼多多API接口通过id抓取商品详情页数据已拼人数等:打造无缝电商体验的秘诀

引言&#xff1a; 在当今的电商领域&#xff0c;提供无缝、高效的购物体验是吸引和保留客户的关键。拼多多API接口正是这样一个工具&#xff0c;它可以帮助商家实现这一目标。接下来&#xff0c;我们将深入了解拼多多API如何助力商家打造卓越的电商体验。 一、拼多多API的重要…

[线程与网络] 网络编程与通信原理(五): 深入理解网络层IP协议与数据链路层以太网协议

&#x1f338;个人主页:https://blog.csdn.net/2301_80050796?spm1000.2115.3001.5343 &#x1f3f5;️热门专栏:&#x1f355; Collection与数据结构 (92平均质量分)https://blog.csdn.net/2301_80050796/category_12621348.html?spm1001.2014.3001.5482 &#x1f9c0;Java …

#招聘数据分析#2024年5月前程无忧招聘北上广深成渝对比情况

#招聘数据分析#2024年5月前程无忧招聘北上广深成渝对比情况 0、根据前程无忧不完全样本统计&#xff0c;北上广深成都重庆平均月工资从高到低依次为 北京15037元、上海14230元、深圳13230元、广州11125元、成都10614元、重庆10388。 1、成都招聘样本数全量36301个&#xff0c…

在家AIAA(美国航空航天学会)文献如何查找下载

今天有位同学的求助文献来自AIAA&#xff08;美国航空航天学会&#xff09;&#xff0c;下面就讲一下不用求助他人自己就可搞定文献下载的途径并实例操作演示。 首先我们先对AIAA&#xff08;美国航空航天学会&#xff09;数据库做个简单的了解&#xff1a; 美国航空航天学会…

C语言:(动态内存管理)

目录 动态内存有什么用呢 malloc函数 开辟失败示范 free函数 calloc函数 realloc函数 当然realooc也可以开辟空间 常⻅的动态内存的错误 对NULL指针的解引⽤操作 对动态内存开辟的空间越界访问 对⾮动态开辟内存使⽤free释放 使⽤free释放⼀块动态开辟内存的⼀部分 …

网络安全宣传 | 干货满满,这些网络安全知识请牢记!

随着社会信息化深入发展 互联网对人类文明进步将发挥更大促进作用 但与此同时&#xff0c;互联网领域的问题也日益凸显 网络犯罪、网络监听、网络攻击等时有发生 网络安全与每个人都息息相关 下面 一起来了解网络安全知识吧 网络安全是什么&#xff1f; 网络安全&#x…

2、Tomcat 线程模型详解

2、Tomcat 线程模型详解 Tomcat I/O模型详解Linux I/O模型详解I/O要解决什么问题Linux的I/O模型分类 Tomcat支持的 I/O 模型Tomcat I/O 模型如何选型 网络编程模型Reactor线程模型单 Reactor 单线程单 Reactor 多线程主从 Reactor 多线程 Tomcat NIO实现Tomcat 异步IO实现 Tomc…

重学java 56. Map集合

我们要拥有一定成功的信念 —— 24.6.3 一、双列集合的集合框架 HashMap 1.特点: a.key唯一,value可重复 b.无序 c.无索引 d.线程不安全 e.可以存null键,null值 2.数据结构:哈希表 LinkedHashMap&#xff08;继承HashMap&#xff09; 1.特点: a.key唯一,value可重复 b.有序 c.无…

特征工程技巧—Bert

前段时间在参加比赛&#xff0c;发现有一些比赛上公开的代码&#xff0c;其中的数据预处理步骤值得我们参考。 平常我们见到的都是数据预处理&#xff0c;现在我们来讲一下特征工程跟数据预处理的区别。 数据预处理是指对原始数据进行清洗、转换、缩放等操作&#xff0c;以便为…

Redis中大Key与热Key的解决方案

原文地址&#xff1a;https://mp.weixin.qq.com/s/13p2VCmqC4oc85h37YoBcg 在工作中Redis已经成为必备的一款高性能的缓存数据库&#xff0c;但是在实际的使用过程中&#xff0c;我们常常会遇到两个常见的问题&#xff0c;也就是文章标题所说的大 key与热 key。 一、定义 1.1…