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

news2024/11/28 0:57:37

目录

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;
}

运行结果如下:

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

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

相关文章

【计算机网络笔记】TCP连接管理(图解三次握手和四次挥手)

系列文章目录 什么是计算机网络&#xff1f; 什么是网络协议&#xff1f; 计算机网络的结构 数据交换之电路交换 数据交换之报文交换和分组交换 分组交换 vs 电路交换 计算机网络性能&#xff08;1&#xff09;——速率、带宽、延迟 计算机网络性能&#xff08;2&#xff09;…

SpringBoot开发组件总结

大家好&#xff0c;今天学习了SpringBoot中间件开发&#xff0c;在学习后总结记录下。 在开发的过程中&#xff0c;把一些公共的非业务的代码提炼出来&#xff0c;做成一个公用的组件&#xff0c;减少开发成本和风险&#xff0c;今天学习的是一个白名单控制组件&#xff0c;记…

PHP之getimagesize获取网络图片尺寸、类型信息

[0]&#xff1a;图像宽度&#xff08;以像素为单位&#xff09;[1]&#xff1a;图像高度&#xff08;以像素为单位&#xff09;[2]&#xff1a;图像类型的标识符[3]&#xff1a;包含字符串的属性&#xff0c;用于布局img元素&#xff08;例如&#xff1a;width"xxx" …

CSS中calc(80vw - 100px)为什么不加空格会不生效?

问题起因 今天再使用calc时发现无法生效&#xff0c;我的写法是&#xff1a; width: calc(100%-100px);页面无效果&#xff0c;加空格后就发现有效果了&#xff1a; width: calc(100% - 100px);有亿点疑惑&#xff0c;这是为什么&#xff1f; calc是什么&#xff1f; css3的…

基于51单片机土壤湿度检测及自动浇花系统仿真(带时间显示)

wx供重浩&#xff1a;创享日记 对话框发送&#xff1a;单片机浇花 获取完整源码源文件仿真源文件原理图源文件论文报告等 单片机土壤湿度检测及自动浇花系统仿真&#xff08;带时间显示&#xff09; 具体功能&#xff1a; &#xff08;1&#xff09;液晶第一行显示实际湿度&am…

成员变量为动态数据时不可轻易使用

问题描述 业务验收阶段&#xff0c;遇到了一个由于成员变量导致的线程问题 有一个kafka切面&#xff0c;用来处理某些功能在调用前后的发送消息&#xff0c;资产类型type是成员变量定义&#xff1b; 资产1类型推送消息是以zichan1为节点&#xff1b;资产2类型推送消息是以zi…

python算法例6 快速幂

1. 问题描述 计算&#xff0c;其中a、b和n都是32位的非负整数。 2. 问题示例 例如&#xff1a;。 3.代码实现 计算a的n次幂对b取余&#xff0c;可以使用快速幂算法。这个算法通过减少乘法和取余操作的次数来提高效率。 def pow_mod(a, n, b):result 1while n > 0:if …

园区网真实详细配置大全案例

实现要求&#xff1a; 1、只允许行政部电脑对全网telnet管理 2、所有dhcp都在核心 3、wifi用户只能上外网&#xff0c;不能访问局域网其它电脑 4、所有接入交换机上bpdu保护 5、只允许vlan 10-40上网 5、所有接入交换机开dhcp snoop 6、所有的交换机指定核心交换机为ntp时间服务…

【Unity数据交互】游戏中常用到的Json序列化

ˊˊ &#x1f468;‍&#x1f4bb;个人主页&#xff1a;元宇宙-秩沅 &#x1f468;‍&#x1f4bb; hallo 欢迎 点赞&#x1f44d; 收藏⭐ 留言&#x1f4dd; 加关注✅! &#x1f468;‍&#x1f4bb; 本文由 秩沅 原创 &#x1f468;‍&#x1f4bb; 收录于专栏&#xff1…

独创改进 | RT-DETR 引入双向级联特征融合结构 RepBi-PAN | 附手绘结构图原图

本专栏内容均为博主独家全网首发,未经授权,任何形式的复制、转载、洗稿或传播行为均属违法侵权行为,一经发现将采取法律手段维护合法权益。我们对所有未经授权传播行为保留追究责任的权利。请尊重原创,支持创作者的努力,共同维护网络知识产权。 文章目录 YOLOv6贡献RepBi-…

面向网络安全-Python语言

目录 1、变量 2、字符串 3、列表 4、字典 5、网络 6、条件选择语句 7、异常处理 1、变量 变量是指储存在某个内存地址上的数据 主要有&#xff1a;整型数、实数、布尔值、字符串、列表、元组、字典 这些数据在声明后&#xff0c;解释器就会自动确定每个变量的类型&…

【云原生 | Docker】Linux 定时自动化备份Mysql数据到本地 Windows 最佳实践,确定不来看看?

&#x1f935;‍♂️ 个人主页: AI_magician &#x1f4e1;主页地址&#xff1a; 作者简介&#xff1a;CSDN内容合伙人&#xff0c;全栈领域优质创作者。 &#x1f468;‍&#x1f4bb;景愿&#xff1a;旨在于能和更多的热爱计算机的伙伴一起成长&#xff01;&#xff01;&…

C#,数值计算——偏微分方程,Mgfas的计算方法与源程序

1 文本格式 using System; using System.Collections.Generic; namespace Legalsoft.Truffer { public class Mgfas { public int n { get; set; } public int ng { get; set; } public double[,] uj; public double[,] uj1 { get; …

云安全-攻防视角下如何看待堡垒机

0x00 堡垒机简介 堡垒机是种网络安全设备&#xff0c;用于保护和管理企业内部网络与外部网络之间的访问。它作为一种中间节点&#xff0c;提供安全的访问控制和审计功能&#xff0c;用于保护内部网络免受未经授权的访问和攻击。堡垒机通常被用作跳板服务器&#xff0c;即堡垒机…

2023辽宁省数学建模A题铁路车站的安全标线完整原创论文详细讲解(含matlab代码)

大家好呀&#xff0c;从发布赛题一直到现在&#xff0c;总算完成了辽宁省数学建模A题完整的成品论文。 本论文可以保证原创&#xff0c;保证高质量。绝不是随便引用一大堆模型和代码复制粘贴进来完全没有应用糊弄人的垃圾半成品论文。 B预计下午两点前更新完毕&#xff0c;A全…

【错误解决方案】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() 函数是用来…

半导体芯片制造行业MES系统解决方案

半导体产业作为现代电子科技的重要支柱&#xff0c;驱动着电子设备和通信技术的飞速发展。随着技术不断演进&#xff0c;半导体制造企业面临着越来越多的挑战&#xff0c;如高度复杂的工艺流程、全球化的竞争、质量控制的要求以及能源效率等问题。 为了应对这些挑战&#xff0…

学电脑编程零基础,计算机编程入门先学什么

学电脑编程零基础&#xff0c;计算机编程入门先学什么&#xff0c;建议先从容易学习的语言入手&#xff0c;比如中文编程。 给大家分享一款中文编程工具&#xff0c;零基础轻松学编程&#xff0c;不需英语基础&#xff0c;编程工具可下载。 这款工具不但可以连接部分硬件&…

第六章 Python函数

系列文章目录 第一章 Python 基础知识 第二章 python 字符串处理 第三章 python 数据类型 第四章 python 运算符与流程控制 第五章 python 文件操作 第六章 python 函数 第七章 python 常用内建函数 第八章 python 类(面向对象编程) 第九章 python 异常处理 第十章 python 自定…