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

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. 注意:他们自动识别类型的,不需要你去多考虑
    在这里插入图片描述

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

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

相关文章

数据库中的视图及三级模式结构

文章目录 一、视图二、数据库三级模式结构 一、视图 简单地说&#xff0c;视图可以看成是一个窗口&#xff0c;它所反映的是一个表或若干表的局部数据&#xff0c;可以简化查询语句。视图一经定义&#xff0c;用户就可以把它当作表一样来查询数据。 但视图和基本表不同&#…

400以内的蓝牙耳机哪款好?400以内蓝牙耳机排行榜

谈起TWS&#xff0c;无论是传统的音频厂商还是手机厂商&#xff0c;都是其不可或缺的重要产品线&#xff0c;现在很多许多蓝牙耳机都不是千篇一律得形状&#xff0c;市场也鲜有商家在外观上下功夫&#xff0c;下面分享几款400元以内&#xff0c;内外兼具的耳机品牌。 一、南卡…

Pytorch实现图像风格迁移(一)

图像风格迁移是图像纹理迁移研究的进一步拓展&#xff0c;可以理解为针对一张风格图像和一张内容图像&#xff0c;通过将风格图像的风格添加到内容图像上&#xff0c;从而对内容图像进行进一步创作&#xff0c;获得具有不同风格的目标图像。基于深度学习网络的图像风格迁移主要…

LeetCode热题HOT100:76. 最小覆盖子串,84.柱状图中最大的矩形、96. 不同的二叉搜索树

LeetCode 热题 HOT 100 76. 最小覆盖子串 题目&#xff1a;给你一个字符串 s 、一个字符串 t 。返回 s 中涵盖 t 所有字符的最小子串。如果 s 中不存在涵盖 t 所有字符的子串&#xff0c;则返回空字符串 “” 。 注意&#xff1a; 对于 t 中重复字符&#xff0c;我们寻找的子字…

ADManager Plus:简化 Active Directory 管理的完美工具

在企业中&#xff0c;Active Directory&#xff08;AD&#xff09;是一个非常重要的组件&#xff0c;用于管理和控制所有计算机和用户的访问权限。然而&#xff0c;AD的管理和维护需要一定的技术能力和时间成本。为了简化这个过程&#xff0c;ManageEngine 推出了 ADManager Pl…

Leetcode-二叉树

1.中序-后序构建二叉树 106. 从中序与后序遍历序列构造二叉树 - 力扣&#xff08;LeetCode&#xff09; 1. 首先根据后序&#xff08;左右中&#xff09;确定顶点元素&#xff1b; 2. 根据顶点元素划分中序序列&#xff1b; 3. 根据划分中序序列中-左子树的长度&#xff0c;进…

数据类型及变量的定义、使用和注意事项

数据类型 计算机存储单元 变量的定义格式&#xff1a; 数据类型 变量名数据值; 我们知道计算机是可以用来存储数据的&#xff0c;但是无论是内存还是硬盘&#xff0c;计算机存储设备的最小信息单元叫“位( bit ) "&#xff0c;我们又称之为“比特位”&#xff0c;通常用…

除了Java,还可以培训学习哪些IT技术?

除了Java&#xff0c;还可以培训学习哪些IT技术&#xff1f; 转行IT学Java似乎已经成为很多人的首选&#xff0c;原因无非是开发技术含量高、开发有前景、开发是一个互联网企业的核心岗位&#xff0c;最重要的是开发薪资待遇高。但其实只单纯因为薪资选择Java的话&#xff0c;小…

百万赞同:网络安全为什么缺人? 缺什么样的人?

1.网络安全为什么缺人? 缺人的原因是有了新的需求 以前的时候&#xff0c;所有企业是以产品为核心的&#xff0c;管你有啥漏洞&#xff0c;管你用户信息泄露不泄露&#xff0c;我只要做出来的产品火爆就行。 这一切随着《网络安全法》、《数据安全法》、《网络安全审查办法》…

什么是机器学习?

目录 简介 机器学习可以做什么 机器学习未来的趋势 总结 简介 机器学习是一种人工智能领域中的技术&#xff0c;其主要目的是让计算机能够自动进行模式识别、数据分析和预测。 机器学习的起源可以追溯到20世纪50年代&#xff0c;当时美国的Arthur Samuel在一篇论文中提出了相关…

静态时序分析Static Timing Analysis4——多时钟域和多时钟时序检查

文章目录 前言一、多时钟域时序分析1、慢时钟域到快时钟域1.1 建立时间检查1.2 保持时间检查1.3 多周期检查 2、快时钟域到慢时钟域2.1 建立时间检查2.2 保持时间检查2.3 合理的约束 3、总结 二、多时钟1、整数倍关系2、非整数倍关系 三、相位移动 前言 2023.4.12 这里讲的多时…

助力研发效能变革,第七届Techo TVP 开发者峰会圆满落下帷幕

引言 在互联网数字企业结束“野蛮扩张”、追求高质量增长的今天&#xff0c;研发效能已然成为企业关注的核心命题。伴随着云原生概念在软件领域的落地生根&#xff0c;云原生正驱动软件应用设计、实现、部署及运维方式的巨变&#xff0c;为研发效能治理带来了新的挑战与机遇&am…

vue-router3.0处理页面滚动部分源码分析

在使用vue-router3.0时候&#xff0c;会发现不同的路由之间来回切换&#xff0c;会滚动到上次浏览的位置&#xff0c;今天就来看看这部分的vue-router中的源码实现。 无论是基于hash还是history的路由切换&#xff0c;都对滚动进行了处理&#xff0c;这里分析其中一种即可。 无…

SpringBoot

文章目录 创建SpringBoot项目快速入门创建Controller启动项目 打包项目创建工件 SpringBoot概述SpringBoot优点起步依赖切换Web服务器 配置文件配置文件application.propertiesapplication.ymlapplication.yaml 三种配置文件优先级yaml格式读取配置数据&#xff08;yml为例&…

windows系统管理_Windows server 2016 组管理与授权

组账户的概述 在 windows 服务器中&#xff0c;当我们需要为多个用户设置相同的权限时&#xff0c;一个一个的逐一设置会比较 麻烦&#xff0c;这个时候我们就需要用到另一种模式&#xff0c;组账户&#xff0c;使用此账户来进行简化操作。 在以后的职场中&#xff0c;每家公司…

Windows环境下调试DAB-DETR与Deformable-DETR

先前都是在服务器上运行DETR的相关程序&#xff0c;服务器使用的是Linux&#xff0c;所以运行较为简单&#xff0c;但如果想要简单的debug的话就没必要使用服务器了&#xff0c;今天便来在Winodws环境下调试DETR类项目&#xff0c;这里以Deformable-DETR与DAB-DETR为例。 首先是…

I.MX6U开发板使用OTG烧写系统

1.系统烧写 在实际的产品开发中肯定不可能通过网络来运行&#xff0c;否则没网的时候产品岂不 是就歇菜了。因此我们需要将 uboot、linux kernel、.dtb(设备树)和 rootfs 这四个文件烧写到板子 上的 EMMC、NAND 或 QSPI Flash 等其他存储设备上&#xff0c;这样不管有没有网络我…

R语言ggplot2 | 绘制随机森林重要性+相关性热图

&#x1f4cb;文章目录 原图复现准备数据集及数据处理构建不同分类随机森林模型的并行计算绘制随机森林变量重要性柱状图计算数据集的相关性热图可视化合并随机森林重要性和热图 附上所有代码 在文献中&#xff0c;我们经常遇到随机森林和相关性热图的组合图片(下图)&#xff0…

Vue3——一文入门Vue3

Vue3的优势 1. 性能的提升 打包大小减少41% 初次渲染快55%&#xff0c;更新渲染快133% 内存减少54% … 2. 源码的升级 使用Proxy代替defineProperty实现响应式 重写虚拟DOM的实现和Tree-Shaking … 3. 拥抱TypeScript Vue3可以更好的支持TypeScript 4. 新的特性 1.C…

什么是文件共享软件?文件传输软件如何共享?

它是一个文件共享软件应用程序&#xff0c;可让强大的数据保护层下将任何大小的文件发送到世界上的任何地方。以光速发送和共享无限数量的文件。可以提交门户并使用语言&#xff0c;品牌&#xff0c;存储等自定义门户。可以选择一个存储点&#xff0c;例如文件传输软件&#xf…