C++基础——对于C语言缺点的补充(1)

目录

1.命名空间:

1.1 为什么要引入命名空间:

1.2 命名空间的作用:

1.3 如何访问命名空间内的变量:

1.4 命名空间的嵌套:

1.5 不同文件下同名命名空间的合并:

1.6 命名空间的展开:

2. C++中的输入、输出:

2.1 C++中如何实现输入、输出:

2.2 通过 来解释命名空间的部分展开:


本篇文章中,不会直接给出C++的介绍,而是在C语言的基础上,给出C++语言相对于C语言的一些不同:

1.命名空间:

1.1 为什么要引入命名空间:

       C++一定程度上修改了C语言某些特性的不足,并且在C语言的基础上补充了一些新的功能,例如本节标题“命名空间”,下面,将通过一段程序来解释命名空间:

#include<stdio.h>

int rand = 0;

int main()
{

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

        对于上面给出的程序中,先建立了一个名为rand的全局变量,随后对这个变量进行打印,在这种情况下,程序是可以正常运行的,但是,如果将上述程序改为下图所示:

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

int rand = 0;

int main()
{

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

 当执行此程序时会发生错误,具体错误类型如下图所示:

        不难发现,发生错误的原因是因为变量rand重定义。而导致发生这一错误的原因就是因为在本程序中,多包含了一个头文件stdlib。在这个头文件中,已经包含了一个用于生成随机数的函数rand,而在后面人为定义rand函数,便造成了rand重定义,针对这种错误,可以称为命名空间的冲突。

1.2 命名空间的作用:

       在了解了命名空间冲突这一概念后,会发现,在C语言中,当需要定义的变量数量较多时,容易发生命名空间冲突这样的错误,在C语言中,也并没有提供解决命名空间冲突这一问题的方法。因此,C++针对这一不足,给出了解决方法,即:通过人为定义命名空间,来解决此问题,定义命名空间的具体代码如下:

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

namespace violent
{
	int rand = 0;
}
int main()
{

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

      上述图片所展示的内容即利用C++关键字namespace来建立了一个名为violent的命名空间。加上命名空间后,程序便可以正常运行:

        运行结果如上图所示,此时的运行结果是一串随机数,这时因为,在加上命名空间violent后,程序所打印的rand并不是命名空间中的rand,而是头文件stdlib中的函数rand,由于函数名在单独打印时相当于指针,所以,打印结果会是随机数,如果将printf函数中的%d改为%p,打印结果便会正常打印这个函数的地址,即:

      通过上面的例子可以推断出,在加入了命名空间后,编译器并不会访问命名空间中的rand,而是访问头文件stdlib函数中的rand,通过这种方式,解决了命名空间冲突的问题。

1.3 如何访问命名空间内的变量:

       上面的部分提出:编译器并不会直接访问命名空间中的变量。这里便引出一个问题,即:如何访问命名空间里面的变量?

      访问命名空间的方法,需要利用一个操作符——域作用限定符——::

      具体访问方法如下图所示:

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

namespace violent
{
	int rand = 0;
}
int main()
{

	printf("%d ", violent::rand);
	return 0;
}

    结果如下:

通过打印结果可以发现,再进行上述的操作后,成功的访问量命名空间内的变量rand

1.4 命名空间的嵌套:

      如果在一个命名空间中也出现了两个名字相同的变量,即:

namespace violent
{
	int rand = 0;

	int rand = 1;
}

可以通过嵌套命名空间来解决此问题,即:

namespace violent
{
	int rand = 0;
	namespace violent1
	{
		int rand = 1;
	}
}

针对嵌套命名空间中的变量的访问,可以通过下面的方式实现,即:

int main()
{

	printf("%d ", violent::violent1::rand);
	return 0;
}

结果如下:

1.5 不同文件下同名命名空间的合并:

        在一个工程的不同文件中,相同名字的命名空间是可以合并的,为了方便演示这个效果,下面命名两个命名空间:test.h,test.cpp,两个文件包含的内容如下方所示:

//Test.h文件

namespace violent
{
	int ADD(int x, int y);
}
//Test.cpp 文件

namespace violent
{
	int ADD(int x, int y)
	{
		int z = x + y;
		return z;
	}
}

利用下面的代码验证,同一工程下,不同文件中的同名命名空间是否会合并:
 

int main()
{

	printf("%d ", violent::violent1::rand);
	printf("%d ", violent::ADD(3, 7));
	return 0;
}

打印结果如下:

可以看到,函数可以正常运行,如果同一工程下的不同文件的同名命名空间不能合并,则调用函数会因为函数只有函数声明,没有函数定义导致无法正常运行。因此,函数的正常运行间接证明了同一工程下不同文件的命名空间是可以合并的。 

1.6 命名空间的展开:

在上面的内容中,给出了访问命名空间的方法,即利用域作用限定符对命名空间中的内容进行访问。但是,这种访问方式过于复杂。如果想要简化访问命名空间中内容的方式,可以同命名空间的展开,具体代码如下:

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

#include"Test.h"

namespace violent
{
	int rand = 0;
	namespace violent1
	{
		int rand = 1;
	}
	int max = 5;
}
using namespace violent;
int main()
{

	printf("%d ", max);
	printf("%d ", ADD(3, 7));
	return 0;
}

运行结果如下:

通过运行结果可以看出,代码没有使用域作用限定符,同样完成了对命名空间中元素的访问。其中,展开命名空间的代码为:

using namespace violent;

        虽然命名空间的展开可以达到简化访问命名空间中变量的作用,但是,并不能轻易展开命名空间,例如C++中自带的命名空间std,此命名空间中包含了C++中的众多函数,如果在不确定认为定义的变量是否与std中的函数名是否冲突的情况下,展开命名空间会导致文章开头的问题。

       对于命名空间的展开,在具体的项目工程中,由于大概率会造成重定义,因此不能展开。但是在日常的个人代码测试及练习中,可以展开命名空间。 对于命名空间的展开还有指定展开这一方式。对于此种展开方式,将在下面的部分给出解释

2. C++中的输入、输出:

2.1 C++中如何实现输入、输出:

       在C语言中,输入、输出这两个功能的实现是利用scanf,printf函数来实现的,在C++中,除了上面的两种方法,还可以借助IO库进行实现,即iostream。在IO库中,定义了不同的对象来实现输入,输出的功能,例如:cin用于处理输入的情况,cout用于处理输出的情况。例如:利用上面的方式,来打印hello  world,具体代码如下:

#include<iostream>
int main()
{
	std::cout << "hello world";
	return 0;
}

运行结果如下:

在C语言中,常常使用\setminus n来完成换行,在C++中,换行的方式多种多样,具体方式如下方代码所示:

#include<iostream>
int main()
{

	/*printf("%d ", max);
	printf("%d ", ADD(3, 7));*/

	std::cout << "hello world\n";
	std::cout << "hello world" << "\n";
	std::cout << "hello world" << std::endl;
	return 0;
}

 运行结果如下:

对于最后一行中的endl,这是一个特殊值,称之为操纵符 ,在将其写入到后方时,可以达到换行的目的。

2.2 通过cin cout来解释命名空间的部分展开:

        输入、输出这两个功能在日常的测试中使用频率很高,不采用命名空间展开,在使用时,使用方法较为繁琐,但是展开命名空间并不一定安全,为了解决上面的两个问题,引出在命名空间这一章节中说到,命名空间的展开存在一种部分展开的方式。代码如下:

#include<iostream>
using std::cout;
using std::endl;
int main()
{

	/*printf("%d ", max);
	printf("%d ", ADD(3, 7));*/

	//std::cout << "hello world\n";
	//std::cout << "hello world" << "\n";
	//std::cout << "hello world" << std::endl;

	cout << "hello world\n";
	cout << "hello world" << "\n";
	cout << "hello world" << endl;
	return 0;
}

运行结果如下:

上述代码中,出现了一个操作符"<<",在C语言中,这个操作符称为位操作符,主要用于整型变量的二进制位的操作,在C++,这个操作符称之为流插入操作符,此操作符的左右两边都接收两个操作数,左边是可以看作输出对象,右边可以看作需要输出的值。

在上述代码中不难发现,进行命名空间的展开时,并没有直接展开std,即没有使用                      using\, \, namespace\, \, std; 这句代码进行展开,而是

using std::cout;
using std::endl;

此种展开方式就是部分展开,即只展开命名空间中的某个特定的函数,对应上面的代码,只展开了cout\, \, \, endl

至此,文章给出了C++中如何进行输出,在C++中,进行输入时,需要利用cin以及流提取操作符">>",具体代码如下:

int main()
{
	int a, b;
	cin >> a >> b;
	cout << a << endl << b << endl;

	return 0;
}

运行结果如下:

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

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

相关文章

canal+es+kibana+springboot

1、环境准备 服务器&#xff1a;Centos7 Jdk版本&#xff1a;1.8 Mysql版本&#xff1a;5.7.44 Canal版本&#xff1a;1.17 Es版本&#xff1a;7.12.1 kibana版本&#xff1a;7.12.1 软件包下载地址&#xff1a;链接&#xff1a;https://pan.baidu.com/s/1jRpCJP0-hr9aI…

openGauss学习笔记-114 openGauss 数据库管理-设置安全策略-设置帐号有效期

文章目录 openGauss学习笔记-114 openGauss 数据库管理-设置安全策略-设置帐号有效期114.1 注意事项114.2 操作步骤 openGauss学习笔记-114 openGauss 数据库管理-设置安全策略-设置帐号有效期 114.1 注意事项 创建新用户时&#xff0c;需要限制用户的操作期限&#xff08;有…

antv/g6元素之combo

介绍 在 G6 中&#xff0c;“Combo” 是一种特殊的元素&#xff0c;用于组合和展示多个节点元素的一种方式。它通常用于表示一个组或子图&#xff0c;将多个相关节点组织在一起&#xff0c;并在图形中以单一的形状显示。 属性 type&#xff1a;Combo 的类型&#xff0c;通常是…

【Redis】Redis常用命令-getsetkeysexistsexpirettltype

文章目录 读取文档注意事项set命令get命令全局/通用命令KEYSEXISTSDELEXPIRETTLTYPE 读取文档注意事项 官方文档链接&#xff1a;https://redis.io/ 注意&#xff1a;redis的命令不区分大小写 在redis文档给出的语法格式说明&#xff1a; []&#xff1a;相当于一个独立的单元&a…

面试—如何介绍项目中的多级缓存?

项目中使用的多级缓存也就是 分布式缓存 Redis 本地缓存 Caffeine&#xff0c;那么令 Caffeine 作为一级缓存&#xff0c;Redis 作为二级缓存&#xff0c;在项目中通过记录数据的访问次数&#xff0c;将热点数据放在 本地缓存&#xff0c;将非热点数据放在 Redis缓存 中&#…

详解RSA加密算法 | Java模拟实现RSA算法

目录 一.什么是RSA算法 二.RSA算法的算法原理 算法描述 三.RSA算法安全性 四.RSA算法的速度 五.用java实现RSA算法 一.什么是RSA算法 1976年&#xff0c;Diffie和Hellman在文章“密码学新方向&#xff08;New Direction in Cryptography&#xff09;”中首次提出了公开…

FSB逮捕为乌克兰网络部队工作的俄罗斯黑客

导语 近日&#xff0c;俄罗斯联邦安全局&#xff08;FSB&#xff09;逮捕了两名涉嫌协助乌克兰网络部队对俄罗斯重要基础设施目标进行网络攻击的个人。这起事件引起了广泛关注&#xff0c;涉及到了网络安全和国际关系等多个领域。本文将为您详细介绍这一事件的背景和最新进展。…

强大的pdf编辑软件:Acrobat Pro DC 2023中文

Acrobat Pro DC 2023是一款强大的PDF编辑和管理软件&#xff0c;它提供了广泛的功能&#xff0c;使用户能够轻松创建、编辑、转换和共享PDF文档。通过直观的界面和先进的工具&#xff0c;用户可以快速进行文本编辑、图像调整、页面管理等操作&#xff0c;同时支持OCR技术&#…

IOS渲染流程之提交图层数据至RenderThread进程

大致链路 UIView/CALayer---->CoreAnimation./Core Graphics/Core Image---->GPU Drive-->GPU 图层树/视图树 一个UIView&#xff08;视图&#xff09;对应一个CALayer&#xff08;图层&#xff09;&#xff0c;CALayer对应显示的数据其有个content代表Bitamp&#…

firefox浏览器添加自定义搜索引擎方法

firefox浏览器添加自定义搜索引擎方法 1.在地址栏添加搜索引擎2.Mycroft Project 搜索引擎附加组件3.通过扩展插件添加自定义搜索引擎 Firefox这货居然不支持直接网址%s的搜索引擎定义方式&#xff0c;以下是添加方法。 firefox国际版119.0 1.在地址栏添加搜索引擎 &#xff…

使用vscode实现远程开发,并通过内网穿透在公网环境下远程连接

文章目录 前言1、安装OpenSSH2、vscode配置ssh3. 局域网测试连接远程服务器4. 公网远程连接4.1 ubuntu安装cpolar内网穿透4.2 创建隧道映射4.3 测试公网远程连接 5. 配置固定TCP端口地址5.1 保留一个固定TCP端口地址5.2 配置固定TCP端口地址5.3 测试固定公网地址远程 前言 远程…

什么是Webpack的loader和plugin?它们的作用是什么?

聚沙成塔每天进步一点点 ⭐ 专栏简介 前端入门之旅&#xff1a;探索Web开发的奇妙世界 欢迎来到前端入门之旅&#xff01;感兴趣的可以订阅本专栏哦&#xff01;这个专栏是为那些对Web开发感兴趣、刚刚踏入前端领域的朋友们量身打造的。无论你是完全的新手还是有一些基础的开发…

vue2和vue3区别

Vue2 和 Vue3 双向绑定方法不同 总结 vue3中没有$set Vue2 和 Vue3 双向绑定方法不同 Vue2 : Object.defineProperty() Vue3 : new Proxy()vue3 实例 数据会更新 const addBtn () >{obj.c 3; } vue2实例 问题&#xff1a;数据更新了视图没更新 Object.defineProperty…

VR全景在医院的应用:缓和医患矛盾、提升医院形象

医患关系一直以来都是较为激烈的&#xff0c;包括制度的不完善、医疗资源紧张等问题也时有存在&#xff0c;为了缓解医患矛盾&#xff0c;不仅要提升患者以及家属对于医院的认知&#xff0c;还需要完善医疗制度&#xff0c;提高医疗资源的配置效率&#xff0c;提高服务质量。 因…

turn.js 模版简单使用

turn.js 不修改添加原功能仅 替换、修改图片格式使用模版 HTML文件 turn.js官网&#xff1a;http://www.turnjs.com/# 第一步 1.点击链接去到官网 2.点击下载按钮 下载左侧示例压缩包 3.解压完成拿到示例文件 turnjs4 4.在samples目录下案例中查看意向使用的模版样式 …

视频会议系统方案报价

视频会议系统 报价方案是咨询视频会议系统价格用户所关注的&#xff0c;但是报价是一个比较细致的工作&#xff0c;需要从多维度进行对比。 1. 视频会议终端设备费用&#xff1a;根据所需设备的数量和所选设备价格确定。视频会议终端类型各异&#xff0c;摄像头、麦克风、显示设…

UWB 技术在机器人和移动领域的应用题】

多年来&#xff0c;机器人生态系统不断增长&#xff0c;不同的应用程序也在不断增长。如今&#xff0c;机器人出现在许多不同的领域&#xff0c;例如私人家庭、商业场所、仓库和医疗场所。他们要么自主工作&#xff0c;要么与我们并肩工作&#xff0c;帮助我们完成任务。 根据…

S5PV210(十):LCD

本文主要探讨210的LCD相关知识。 LCD LCD称液晶(透光背光呈色),可在电信号驱动下使液晶分子旋转,呈现不同的颜色(被动发光) lcd接口为TTL接口(5V为1&#xff0c;0V为0),不能传输太远,远距离传输方式:SoC(TTL) ->VGA-> LCD(TTL) 其他显设备:CRT(…

【错误解决方案】TypeError: gca() got an unexpected keyword argument ‘projection‘

1. 错误提示 在 python程序中&#xff0c;使用Matplotlib库中的 gca() 函数出现错误&#xff0c;提示“TypeError: gca() got an unexpected keyword argument projection”。 2. 解决方案 这个错误的原因是 gca() 函数并不接受 projection 这个关键字参数。 gca() 函数是用来…

js调整table表格上下相邻元素顺序

有时候我们会遇到要通过箭头控制table表格上下顺序的需求,如下: 点击向下就将该元素下移一位,下面的一位元素就移上来,点击向上就将该元素上移一位,上面的一位元素就移下来,也就是相邻元素互换位置顺序: <el-table :data="targetTable" border style=&quo…