C++命名空间域namespace与域作用限制符: :,cin,cout输入输出简单介绍

news2025/1/16 20:00:38

TIPS

  1. C++是在C的基础之上,容纳进去了面向对象编程思想,并增加了许多有用的库,以及编程范式等
  2. C++总计63个关键字,C语言32个关键字,具体没有必要先不去管它
    在这里插入图片描述

域,命名空间域与namespace关键字

  1. cpp需要解决的第一个问题就是命名空间的问题。
  2. 在之前讲的是在c语言的基础之上。假设现在先去定义一个全局变量rand,然后再main函数里面去编译打印变量一下,发现就是可以通过的。但是你只需要再加一个头文件stdlib.h,它就通不过了。为什么呢?
  3. 这时候你会发现他报错:重定义了。这边就是发生冲突了,变量命名的规则就是:比如说不能与关键字发生冲突,首字母必须是什么啊等等。但是他没有规定说变量名不能定义成rand,那这边发生冲突的一个原因就在于与库发生冲突了,因为stdlib.h里面有一个函数就叫做rand就是产生随机数的那个函数,因此名字就发生冲突了。
    在这里插入图片描述
    如上,这是C的一个缺陷之一。
  4. 因此c语言有命名冲突的问题,命名冲突主要有两方面:第一方面就是我们跟标准库冲突了,有些东西在库里中已经定义过了。最难受的是比如说你定义了一个变量,那我也不知道头文件里面的那些具体的细节是什么啊,诶突然有一天包了一个头文件上去发现就报错了,然后不包头文件就又不报错…所以说在c语言的大型项目有个很恶心的问题:有一天你把c语言的某个库给他引进来的话,第一步要解决的就是好多命名冲突问题,因为你这边定义的某个变量那个库里面也定义了相同名字的东西。
  5. 第二方面就在于:在公司里面是一个项目组,然后项目的话不是一个人独立完成写的。而是有很多小伙伴写的,那就有一种可能你写的与我写的发生冲突。这个完全避免不了。

域与命名空间域

  1. 其实之前在c语言的时候也有域这个概念提及(作用域就是域的一种,作用域分为全局域与局部域)
  2. 域有作用域(全局域,局部域),类域,命名空间域
  3. 在同一个域里面,不可以定义同名的变量。但是在不同的域里面,就可以定义同名的变量。比如说同样是变量a可以放在局部域里面,也可以放在全局域里面。但会影响访问,也会影响生命周期。
    在这里插入图片描述
    在这里插入图片描述

namespace与命名空间域的定义

  1. 在C/C++中,变量、函数和后面要学到的类都是大量存在的,这些变量、函数和类的名称将都存在于全局作用域中,可能会导致很多冲突。
  2. 使用命名空间的目的是对标识符的名称进行本地化,以避免命名冲突或名字污染,namespace关键字的出现就是针对这种问题的
  3. namespace叫做命名空间,其实就是用来解决命名冲突的问题。这个关键字就可以定义一个域出来。如果想要不冲突,就可以用域去隔离。用命名空间就可以去定义一个命名空间域,就可以起到隔离效果。
  4. 然后这个namespace可以自己去创建一个命名空间域。当命名空间域,局部域,全局域这几个域全都同时存在的时候,然后比如说要去访问变量搜索的顺序优先是局部域,其次是全局域。如果说全局域也没有这个变量的话,如果你没有特别指定或者打开命名空间域,不会自动主动去命名空间域当中搜索。因此默认情况下是不会的。只有有两种可能性,他才会到命名空间域当中去搜索,1. 打开了命名空间域,2. 指定命名空间域搜索顺序(后面会讲)。
  5. 定义命名空间,需要使用到namespace关键字,后面跟命名空间的名字,然后接一对{}即可,{}中即为命名空间的成员。
  6. 在命名空间域当中,除了可以定义变量之外,还可以定义函数与类型等等,是个大杂烩
namespace sjy
{
	int rand = 666;
	int add(int a, int b)
	{
		return a + b;
	}
	typedef struct Stu
	{
		char name[10];
		int age;
		float score;
	}Stu;

	//.............
}
  1. 在c语言当中没有办法用命令名空间(压根没这玩意儿)去解决这个命名冲突的问题,而cpp有,C++的话本身有内置命名空间域std,比如说stl与cpp库都是定义在一个大的命名空间std当中。
  2. 一个命名空间就定义了一个新的作用域,命名空间中的所有内容都局限于该命名空间中

打开命名空间域 using namespace …(打开命名空间域本质就是融入到全局域当中)

  1. 展开命名空间域就是using namespace 命名空间域的名字,注意:std是标准库的命名空间域(内置).
#include <iostream>
namespace sjy
{
	int rand = 666;
	int add(int a, int b)
	{
		return a + b;
	}
	typedef struct Stu
	{
		char name[10];
		int age;
		float score;
	}Stu;

	//.............
}
using namespace std;
using namespace sjy;
  1. 易错点:在全局变量已经有a的情况之下,假设此时命名空间域当中也有一个a,然后我把命名空间域给他展开using namespace…
    打开命名空间域本质就是融入到全局域当中,这时候这两个就不能够同时存在。
    在这里插入图片描述

指定命名空间搜索顺序(域作用限定符)

  1. 访问的时候我们都知道遵循局部优先原则。那然后假设我在局部范围内已有该命名的情况下就想访问那个名字一模一样的全局变量嘞?
  2. 在cpp当中就有方法:用“: :”域作用限定符。在访问的时候默认显示在局部域搜索,局部有的话优先局部,如果在局部域中搜不到的话,就去全局域当中去搜索。这个域作用限定符表示去这个限定符左边这个域去搜索(有多个的话就从左到右这个命名空间搜索顺序),空白就代表直接全局域(也不需要去加空格)
  3. 在那些顺序当中,如果不加以人为干扰的话,局部域有了,全局域就不会继续在那里找下去。那我如果假设就想访问全局域的,就用 : : x就可以了。那我如果假设就想访问命名空间域的,就用 命名空间域名字 : : x
  4. 不同的域当中完全可以存在名字相同的变量,默认访问的是局部域,然后全局域,然后命名空间域的话就看他打不打开,或者我直接指定顺序访问

在这里插入图片描述

针对头文件的一些说明

  1. 头文件实际上就代表着他所分装的一个代码块而已。当在开头把头文件怎么写好之后,等会儿在预处理编译阶段就会把这个头文件所对应封装的一个代码块直接拷贝到那个开头。
  2. 但该打开命名空间的还是得打开,不然的话,编译其实不认得那些代码里面的命名符号
  3. 在C++里面的头文件是没有.h了的
  4. C++的stl与标准库有着各种各样,形形色色的头文件,但由于stl与标准库都是在内置的命名空间域std当中,所以说要真正使用的话,要么就是去打开std(或者部分打开),要么就是用域作用限定符去指定命名搜索顺序
  5. 比如说在头文件stdlib.h当中有一个rand,然后把这个头文件给他include一下,那么相当于就把这个头文件当中的所有内容拷贝到那个地方去,所以说相当于就是在全局范围当中已经有一个rand,如果说此时想要再去定义一个rand的变量就要给他放到一个域当中,但对于这个命名空间域的话,不能够随意展开。不然又裂开了,当命名空间域打开之后,相当于已经融入到了全局域当中,此时此刻命名空间域当中有一个名称rand,stdlib.h当中也有rand,不就又冲突了嘛
  6. 头文件的内容展开Include一下,相当于就是说把头文件当中的内容给它包含在这上面,拷贝到那个地方去;命名空间域的展开using namespace就是决定编译时是不是到这个空间域当中去搜索一下

命名空间域的嵌套与合并

  1. 命名空间与相互之间可以互相嵌套,namespace嵌套namespace在嵌套namespace,在不同命名空间当中,当然是可以去创建相同名字的变量。因为这些相同名字的变量之间互不干涉与影响。
  2. 在同一个命名空间域当中,如果又会存在命名冲突的话,就在命名空间里面再去嵌套命名空间。
  3. 同一个工程中允许存在多个相同名称的命名空间,编译器最后会合成同一个命名空间中
  4. 这个的话举个很明显的例子就是说:比如说C++里面的stl与标准库的话,有各种各样很多的头文件,然后再分别写里面,在实现这些头文件的时候,由于我们知道必须是在一个规划好的命名空间域当中,比如说有50个头文件,然后每个头文件里面在代码实现的时候都namespace std1…最后总的合起来会把这些命名空间域std1全部合成起来归为一个
    请添加图片描述

实际对命名空间域std展开的提醒(部分打开命名空间域)

  1. 日常练习可以using namespace std全部展开
  2. 但是在实际写项目的过程当中,并不建议直接把命名空间域std直接全部展开,因为一旦把命名空间域std全部展开的话,相当于与全局域已经融为一体。这时候已经写好的在全局域当中的代码可能会与标准库,stl当中的代码发生命名冲突,改起来会非常麻烦
  3. 项目只建议指定访问,不要轻易展开命名空间
  4. 在实际应用当中就是经常是把那些常用的函数,变量等等给它展开,不是直接using namespace std 全部一把展开,采用的是部分展开的方式,把那些常用的给他都展展开,然后其他不常用的用一个域作用限定符去指定一下命名搜索顺序,临时访问一下就可以
    在这里插入图片描述
    在这里插入图片描述

C++的输入与输出 cin && cout && endl 简单介绍

  1. 使用cout标准输出对象(控制台)和cin标准输入对象(键盘)时,必须包含< iostream >头文件以及按命名空间使用方法使用std。
  2. cout和cin是全局的流对象,endl是特殊的C++符号,表示换行输出,相当于换行符\n,他们都包含在包含< iostream >头文件中。
  3. <<是流插入运算符,>>是流提取运算符。
  4. 使用C++输入输出更方便,不需要像printf/scanf输入输出时那样,需要手动控制格式。C++的输入输出可以自动识别变量类型。
  5. 实际上cout和cin分别是ostream和istream类型的对象,>>和<<也涉及运算符重载等知识,这些知识我们我们后续才会学习,所以我们这里只是简单学习他们的使用。后面我们还有有一个章节更深入的学习IO流用法及原理。
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
  6. cin连续输入的时候,就用多个流提取运算符给他串起来就可以,非常快捷
  7. cout连续输出的时候,也是用多个流插入运算符串起来,如果说没有在中间加入空的话,那么这些东西都是紧挨着连成一串的
  8. 注意:他们自动识别类型的,不需要你去多考虑
    在这里插入图片描述

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

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

相关文章

Java后端面试题 重难点和被问到没答上来的点(包括java基础、关系型数据库、Redis、计算机网络、Spring、Java多线程、vue等)

以下是我记录的一些重点问题和面试中被问到没答上来的问题&#xff0c;包括java基础、关系型数据库、Redis、计算机网络、Spring、Java多线程、vue 问题目录 1.fail-safe和fail-fast2.四引用3.explain字段重要内容4.maven三大生命周期5.MYSQL 创建修改表6.数据库三范式7.Strin…

华科超算用户手册的学习笔记

1. 资源计费 1.1 费用记账 日期费用&#xff08;上限3000元&#xff09;2023.04.171002023.04.18200总计300 1.2 创建实例时显示项目的余额不足 这是因为项目账户之中目前还没有足够的卡时&#xff1b; Note 这里是因为上次充值的卡时还在田老师的个人账户中&#xff0c;还需…

vue el-table 单机行选中高亮并获取行数据,再次单击取消行选中

1. 效果展示 当没有行被选中时&#xff0c;按钮是不可用的 当有行被选中时&#xff0c;该行高亮&#xff0c;同时按钮可用 再次点击该行&#xff0c;取消高亮&#xff0c;按钮不可用 2. 代码 2.1 组件代码 table设置了highlight-current-row&#xff0c;可以在选中某个数据行…

List集合和Set集合的区别

Collection集合总结 在进行Java开发的时候经常会用到集合&#xff0c;而集合又主要分为两种&#xff1a;Collection单列集合和Map集合。这里主要介绍一下Collection的一些常用子接口的区别。 Collection集合&#x1f62e; 指单列集合&#xff0c;存储的一组对象。 List&#x…

4大方法,教你如何做好项目管理

作为一个项目经理&#xff0c;项目管理是我们日常工作最核心的一项职能。无论是公司的业务开发还是重大项目的推进&#xff0c;都离不开项目管理。然而对于很多初入职场的人来说&#xff0c;项目管理还是一个相当新颖、陌生的领域&#xff0c;因此我今天就来分享一些我在项目管…

【安全与风险】密码安全和用户认证

密码安全和用户认证 基本问题证明你是谁为什么要验证还需要什么基于口令的身份认证常用使用模式常用使用模式可惜的是社会工程悉尼大学 (绿化96)尴尬和记忆关于密码使用的3个主要问题UNIX形式的密码密码散列字典式攻击影子密码其他密码问题生物计量学多模式生物识别系统定义为什…

数字化体验时代,企业如何做好内部知识数字化管理

随着数字化时代的到来&#xff0c;企业内部的知识管理也面临着新的挑战和机遇。数字化技术的应用&#xff0c;可以极大地提高企业内部知识的数字化管理效率和质量&#xff0c;从而提升企业内部的工作效率、员工满意度和企业竞争力。本文将从数字化时代的背景出发&#xff0c;探…

NVM安装nodejs的方法

前提&#xff1a; 为解决nodejs升级后出现的各种问题&#xff0c;使用NVM在一台电脑上安装多个版本的nodejs&#xff0c;以便项目可以根据自身使用的node版本来开发。 nodejs版本的查询地址&#xff1a; https://nodejs.org/zh-cn/download/releases/ nodejs下载官网地址&…

17.样式冲突

写在 .vue 组件中的样式会全局生效&#xff0c;比如我现在有一个LEFT组件 有一个RIGHT组件 将LEFT组件与RIGHT组件放在App组件中 发现我只给LEFT样式&#xff0c;但是在RIGHT中也生效了 为了避免这种情况&#xff0c;我们有下面几种解决方式 目录 1 具体到指定的标签 2 sc…

【微信小程序-原生开发】实用教程22 - 绘制图表(引入 echarts,含图表的懒加载-获取到数据后再渲染图表,多图表加载等技巧)

最终效果预览 实现流程 微信小程序中使用 echarts 需使用官方提供的 ec-canvas 组件 1. 下载 ec-canvas 组件 点击下方链接&#xff0c;下载 ec-canvas 组件 https://gitcode.net/mirrors/ecomfe/echarts-for-weixin/-/tree/master 将其中的 ec-canvas 文件夹拷贝到微信小程序…

数据结构考研版——用栈实现后缀表达式前缀表达式求值

用栈实现后缀表达式求值 int calsub(float opand1,char op,float opand2,float &result) {if(op){resultopand1opand2;}if(op-){resultopand1-opand2;}if(op*){resultopand1*opand2;}if(op/){//判断是否为0一般把它与我们宏定义的极小值值进行比较&#xff0c;接近于0则视…

把你的阿里巴巴图标库转成你自己的@ant-design/icons

背景 我们使用iconfont-阿里巴巴矢量图标库来管理自己的一套图标&#xff0c;并且基于它的js资源&#xff0c;封装了自己的icons图标组件。封装的方法是使用了antd提供的createFromIconfontCN方法 但随着图标库越来越大&#xff0c;JS资源文件也变得越来越大。在业务中&#x…

protobuf序列化原理、安装与应用

目录 protobuf序列化 protobuf的原理 protobuf 的安装 编译message文件 应用protobuf protobuf序列化 protobuf是一种比json和xml等序列化工具更加轻量和高效的结构化数据存储格式&#xff0c;性能比json和xml真的强很多&#xff0c;毕竟google出品。 官网&#xff1a;https:…

C语言笔记 | 一元三次方程

文章目录 0x00 前言 0x01 问题分析 0x02 代码设计 0x03 完整代码 0x04 运行效果 0x05 参考文献 0x06 总结 0x00 前言 在 1545 年&#xff0c;意大利学者卡丹所写的《关于代数的大法》中&#xff0c;提出了一元三次方程的求根公式。人们将其称为卡丹公式。对于标准型的一…

Python 彩蛋 —— 开发人员留下的惊喜

Python 彩蛋 —— 开发人员留下的惊喜 简介&#xff1a;Python 核心程序开发人员在软件内部设计了2个彩蛋。一起来看看吧。 文章目录 Python 彩蛋 —— 开发人员留下的惊喜&#x1f4a1;彩蛋一&#xff1a;Python 之禅&#x1f4a1;彩蛋二&#xff1a;Python 有趣的漫画 &#…

程序员面试完之后,人麻了...

去面试吧 面不被录用的试 面hr为了完成任务的试 面一轮二轮没有下文试 面需要通勤2小时的试 面随时加班的试 ...... 今年的“金三银四”被网友们称为“铜三铁四”&#xff0c;招聘软件上的岗位都能背下来了&#xff0c;简历却依然石沉大海。 好不容易等来个回复&#xff…

南京邮电大学通达学院2023《电子装配实习》报告

南京邮电大学通达学院2023《电子装配实习》报告 一 声明二 题目/实习报告提示三 例答 红笺寄 休遣玉人知 ——赠nmy 一 声明 南京邮电大学通达学院2023《电子装配实习》报告 答案更新时间:2023.04.10&#xff0c;已更新完成&#xff0c;如无错误不在更新 由于作者解答能力有限…

计算带宽使用情况

由于大多数组织依靠其 IT 基础架构进行日常业务关键型运营&#xff0c;因此网络带宽可以对其网络性能产生巨大影响。连接不良可能会使组织花费大量资金并影响生产力。这就是为什么监控和计算带宽使用情况对于确保组织的最佳网络带宽性能至关重要的原因。 在计算企业的带宽使用…

Linux以非堵塞模式执行shell脚本

1. HOW 我们在linux系统的终端执行命令的时候&#xff0c;有些命令可以很快的执行完退出&#xff0c;我们就可以继续使用这个终端了 比如 ls 这个命令&#xff0c;它执行的很快&#xff0c;等他返回完结果之后&#xff0c;我们可以继续使用这个终端。 还有部分命令是不会立马…

算法——双指针技巧总结

算法——双指针技巧总结 一、双指针二、链表快慢指针19.删除链表的倒数第 N 个结点双指针 206.反转链表思路&#xff1a;双指针法递归法 92.反转链表 II1.递归2.迭代&#xff08;双指针头插法&#xff09; 876.链表的中间结点常规思路双指针思路 141.环形链表&#xff08;判断链…