C++基础知识-----命名空间

news2024/10/7 2:22:57

本期开始我们来对C++进行学习

目录

1.C++关键字

2.命名空间 

3.C++的输入与输出


1.C++关键字

C++总计63个关键字,C语言32个关键字

asmdoifreturntrycontinue
autodoubleinlineshorttypedeffor
booldynamic_castintsignedtypeidpublic
breakelselongsizeoftypenamethrow
caseenummutablestaticunionwchar_t
catchexplicitnamespacestatic_castunsigneddefault
charexportnewstructusingfriend
classexternoperatorswitchvirtualregister
constfalseprivatetemplatevoidtrue
const_castfloatprotectedthisvolatilewhile
deletegoto

reinterpret_cast

我们并不需要刻意的去记住这些关键字,在后续使用中我们就会慢慢熟悉他们

2.命名空间 

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

#include<stdio.h>
#include<stdlib.h>

int rand = 10;
int main() {
	printf("%d\n", rand);
	return 0;
}

 我们在编译这一段代码时,会出现错误,在C语言中,并不会出现这种错误,但是在C++中却会报错

我们来看这段错误,是重定义,即我们定义的rand和库中的一个rand函数冲突,所以在C语言中,是存在命名冲突的

命名冲突主要包含两方面,一方面是我们和库冲突,所以在使用C语言写一些大型项目时会出现这样的问题,在我们引入某个库后会出现一堆报错,因为我们定义的变量或者函数和库里的冲突了,另一方面是我们互相之间冲突,比如两个人写一个项目,一个人定义了一个了一个变量a,另一个人也定义了一个变量a,最后两个代码是会合并的,而合并时就会出现冲突,此时就需要一个人来改变变量名,如果将这个变量使用了成百上千遍,那就非常麻烦了

为了解决这个问题,C++引入了命名空间

我们在网络上看C++代码时,经常能看到这样一段代码

#include<iostream>
using namespace std;

第二行的代码是什么意思呢?我们先将这个问题保留,一会回过头来看

为了使程序不冲突,我们使用域来进行隔离

#include<stdio.h>
#include<stdlib.h>
//域
namespace hello {
	int rand = 10;
}

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

 我们先看这段代码

#include<stdio.h>
#include<stdlib.h>

int a = 0;
int main() {
	int a = 10;
	printf("%d", a);
	return 0;
}

我们知道,这两个a是可以同时存在的,main函数里的a是局部变量,也就是在局部域,而外部的a是全局变量,也就是在全局域,我们知道,运行这段代码,会输出10

如果我们想要访问全局的a,该如何访问呢?

在C++里,我们可以使用::来进行访问,:: 叫做域作用限定符,局部域和全局域,是优先在局部搜索,没有局部才在全局搜索,::的左边什么也没有(加上空白是为了好看)

我们再看这样一段代码

#include<stdio.h>
#include<stdlib.h>

int a = 0;
namespace hello {
	int a = 10;
}
int main() {
	int a = 20;
	
	return 0;
}

这3个a我们该如何访问呢?

 如果我们直接进行访问,访问的是局部的a

如果局部不存在,接下面就是全局搜索了 ,而命名空间域里的变量,不指定是不会去搜索的

 如果想要访问命名空间域,有两种操作,一种是展开命名空间域,另一种是指定访问命名空间域

所以using namespace是展开命名空间域,此时我们回过头来看using namespace std;

这段代码的意思就是展开命名空间域,而这个std是标准库的命名空间

那如果我们想要同时访问3个a呢?

 这个操作就是指定访问命名空间域,::前面什么都不加,就是访问全局域

我们再看这种情况,展开的本意就是暴露到全局,所以是会报错的

此时就不知道你需要访问哪一个了

所以我们不要轻易展开命名空间,展开是编译时是否去命名空间中搜索,没有展开就不会去搜索

我们再回过头来解决rand的问题,我们只需指定访问即可解决 

命名空间除了定义变量,还可以定义函数,定义类型,唯一要注意的是命名空间最后的 } 后是没有 ; 的

命名空间也是可以嵌套的

namespace n1
{
	int a = 10;;
	int b;
	int add(int left, int right)
	{
		return left + right;
	}
	namespace n2
	{
		int a = 20;
		int c;
		int d;
		int sub(int left, int right)
		{
			return left - right;
		}
	}
}

命名空间过大时,为了防止冲突时就需要使用嵌套分割

嵌套的命名空间我们需要访问时要进行如下操作

 多个同名的命名空间是会被合并的

这里我定义了两个头文件

在每个头文件里都定义了hello的命名空间

我们在test.c里可以对这三个命名空间里数据进行访问,这三个命名空间合并成了一个命名空间

C++里有STL库,每个库都有命名空间,最后也合并在一起,就是这样使用的

 下面,我们回过头来看这句代码

#include<iostream>

我们发现c语言的头文件都是xxx.h,而c++不是.h,为什么呢?

其实在早年的时候,是有#include<iostream.h>的,但是现在只能在很老的编译器下使用,这个头文件是没有命名空间的,但是C++后面有了命名空间后,很多库都用了命名空间,,而且有时候会和C有冲突,比如C的string.h,在C++里也有string,所以C++标准库就直接把.h去掉了

C++的iostream库里有一个cout,这个类似C里面的printf,但是我们发现这里报错了,原因就是我们上面说的,如果我们不指定访问或者展开命名空间,就不会去主动搜索

我们的一种解决办法为让他直接去命名空间搜索

 但是这样写我们每次都要加std::,是非常麻烦的

第二种办法就是我们展开命名空间

 

 另外,我们展开不展开都是可以加std::的,一般是推荐使用第一种方法

我们展开的话是要去std里搜索,但前提是上面有std,如果没有的话也是不行的 ,不加是不会搜索的

但是用using namespace std;全部展开是有风险的,如果我们和库有冲突,就会报错

所以我们建议项目里面不要展开,在项目里我们用指定访问,不要轻易展开

我们使用这种办法,展开常用的即可

3.C++的输入与输出

我们在上面使用了cout,这是一个全局对象

我们发现cout << "hello "  << endl;

<<在C里面叫做移位运算符,在C++里叫做流插入运算符,并且可以支持多个值输出

我们输出了字符串hello world,输出了10,\n是换行,endl也是换行,endl也是全局的

cout相比于printf,真的强大的地方在于自动识别类型,我们使用printf需要指定%d,%f等等,而cout不需要指定类型

 既然有cout,与之对应的还有cin,这个类似scanf

>>叫做流提取运算符

这几个可以混着用,大家怎么舒服怎么来就行

以上即为本期全部内容,希望大家可以有所收获

如有错误,还请指正

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

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

相关文章

摘得重磅奖项,发表精彩演讲,深度参编报告!美创闪耀CSA GCR大会

4月13日&#xff0c;第六届云安全联盟大中华区大会在上海举办&#xff0c;大会由联合国数字安全联盟、上海市经济和信息化委员会、上海市委网络安全和信息化委员会办公室、上海市普陀区人民政府指导&#xff0c;云安全联盟大中华区主办。 作为零信任数据安全践行者&#xff0c;…

java银行ATM机模拟系统dzkf94

目录 摘要 I Abstract II 第1章 绪论 1 1.1 ATM简介 1 1.2 ATM发展 1 1.3 开发意义 1 1.4 论文的组成 1 1.5 本章小结 2 第2章 系统分析 3 2.1 功能需求分析 3 2.2 业务流程分析 4 2.3 数据流程分析 5 2.4 本章小结 7 第3章 系统开发技…

车载网络 - Autosar网络管理 - 常用缩写

为了方便大家日常工作中的使用和交流&#xff0c;每块专业规范或者文章中&#xff0c;都会有或多或少的缩写使用&#xff0c;然而如果一段时间没使用&#xff0c;经常会忘记这些缩写到底代表的是什么意思&#xff0c;为了方便后续内容的介绍&#xff0c;也为了我自己后面忘记后…

【数据分析之道-NumPy(四)】numpy广播机制

文章目录 专栏导读1、广播机制2、一维数组和二维数组的广播3、二维数组和三维数组的广播4、标量和数组的广播5、形状不兼容的数组不能进行广播专栏导读 ✍ 作者简介:i阿极,CSDN Python领域新星创作者,专注于分享python领域知识。 ✍ 本文录入于《数据分析之道》,本专栏针对…

MySQL---数据类型

文章目录前言一、数据类型分类二、数值类型1.tinyint类型2.bit类型三、小数类型1.float2. decimal三、字符串类型1.char2.varchar3.char和varchar比较四、日期和时间类型五、enum和set我们如何找到性别是男或者女呢?我们如何找到爱好有rapper呢?总结前言 正文开始!!! 一、数…

MyBatis 批量插入的正确姿势

近日,项目中有一个耗时较长的Job存在CPU占用过高的问题,经排查发现,主要时间消耗在往MyBatis中批量插入数据。mapper configuration是用foreach循环做的,差不多是这样。 这个方法提升批量插入速度的原理是,将传统的: INSERT INTO `table1` (`field1`, `field2`) VALUES …

Linux服务器怎么关闭防火墙?

Linux服务器怎么关闭防火墙&#xff1f; 在很多情况下&#xff0c;防火墙都会组织一些端口号的通讯。 比如我们的tomcat&#xff0c;nginx&#xff0c;redis明明安装的没问题&#xff0c;但在外部就是访问不了&#xff0c;那很有可能就是防护墙的原因了。我是艾西&#xff0c;…

protobuf编码格式解析

示例 假如定义一个如下的protobuf类型 message Person {required string user_name 1;optional int64 favorite_number 2;repeated string interests 3; }将其赋值为: user_name : "Martin" favorite_number : 1337 interests:"daydrea…

pyLoad远程代码执行漏洞复现(CVE-2023-0297)

1、产品简介 pyLoad是一个用 Python 编写的免费和开源下载管理器&#xff0c;可用于NAS、下一代路由器、无头家庭服务器以及任何能够连接到互联网并支持 Python 编程语言的设备。 2、漏洞概述 pyLoad 存在代码注入漏洞&#xff0c;未经身份验证的攻击者可以通过滥用 js2py 功能…

c/c++:类型限定符,printf输出格式,putchar,scanf,getchar

c/c&#xff1a;类型限定符&#xff0c;printf输出格式&#xff0c;putchar&#xff0c;scanf&#xff0c;getchar 2022找工作是学历、能力和运气的超强结合体&#xff0c;遇到寒冬&#xff0c;大厂不招人&#xff0c;此时学会c的话&#xff0c; 我所知道的周边的会c的同学&am…

结构方程模型(SEM)高阶应用系列

结构方程模型&#xff08;Structural Equation Modeling&#xff09;是分析多变量间因果关系的利器&#xff0c;在众多学科领域具有巨大应用潜力。我们前期推出的《基于R语言结构方程模型》通过结构方程原理介绍、结构方程全局和局域估计、模型构建和调整、潜变量分析、复合变量…

docker-compose安装prometheus告警系统

docker-compose安装Prometheus一、概述一、docker-compose二、配置文件一、概述 本文只有监控与告警的安装、告警发送、发送模版的配置。没有数据展示监控数据UI工具 一、docker-compose 1&#xff09;docker-compose.yaml version: 3.0 services:#1.prometheusprometheus:…

springcloud学习总结

springcloud 构建微服务项目步骤 导入依赖编写配置文件开启这个功能 Enablexxx配置类 于2023年2月24日下午17点38分开始学习于2023年3月17日晚上20点26分学完总结代码地址&#xff1a;https://gitee.com/liang-weihao/StudySpringcloud学习笔记地址&#xff1a;https://www.…

【Linux-MYSQL】数据库的使用

目录 1.数据库介绍 &#x1f308;1.1数据库的分类 &#x1f308;1.2存储引擎 2.数据库的操作 &#x1f308;2.1创建数据库 ​编辑&#x1f47f; 1.查show databases; &#x1f47f;2删除 drop database库名 &#x1f47f;3.创建 create 查看创建数据库的详细信息 &…

朝花夕拾 - 卷王的自白(光头祭天,法力无边》

一、震撼开场 做一个卷王 ta 有什么错&#xff0c;无非就是 ——「秃」了那么一点点&#xff01;&#xff01;&#xff01;咳咳咳&#xff0c;一一回复&#xff1a;自愿的没有想不开没有考到寺庙心态正常……如果非要给这次的行为贯穿一个理由&#xff0c;那就是「下周四就 28 …

Nfinity.io ——Web3.0创新性内容创作和社交一站式平台,引领NFT社交新时代

Nfinity.io 是什么&#xff1f; Nfinity.io 是一个Web3.0时代创新性内容创作和社交一站式平台&#xff0c;旨在彻底改变创作者、平台和粉丝的互动关系。该平台允许用户在同一个平台访问他们在 TikTok、YouTube 和 Twitter 等热门社交平台上喜欢/关注的创作者。此外&#xff0c…

图形系统:简简单单学习WindowManagerService的启动流程

作者&#xff1a;新小梦 在系统启动流程中&#xff0c;Zygote进程通过fork自己来创建SystemServer进程。SystemServer进程的主要职责之一就是创建SystemServiceManger&#xff0c;使自己成为服务的注册中心&#xff0c;并启动三种不同类型的服务&#xff1a;引导服务、核心服务…

mqttx read econnreset异常排查

mqtt 会话 read econnreset 使用mqttx连接mqtt服务器时出现READ ECONNRESET的排查 前段时间公司新增了mqtt服务器&#xff0c;在我们初步测试的时候没有问题&#xff0c;但是随着连接数量增多&#xff0c;后续几天连续间隔出现READ ECONNRESET&#xff0c;导致项目无法正常使…

Unity Batching 批处理

Unity Batching 批处理 了解批处理前先了解下 Draw Call 要了解 Draw Call 需要先了解游戏引擎是如何把物体图像绘制到屏幕上的。 (1)&#xff1a;渲染流水线 渲染流水线的任务为从一个 二维、三维场景开始&#xff0c;最终渲染为一张二维图像&#xff0c;显示在屏幕上。 计算…

使用Unit Scaling进行FP16 和 FP8 训练

Unit Scaling 是一种新的低精度机器学习方法&#xff0c;能够在没有损失缩放的情况下训练 FP16 和 FP8 中的语言模型。 使用FP16和BFLOAT16替代FP32可以将内存、带宽和计算需求的大幅减少&#xff0c;这也是目前越来越大的模型所需要的。 背景介绍 随着支持fp8的硬件的发展&…