【C+ +】第一个C+ + 项目的创建及namespace命名空间解释C++中的输入输出

目录

1.创建第一个c++项目 

1.1项目创建

1.2 .cpp源文件建立 

1.3 第一个c++程序hello world对比c语言hello world 

2.命名空间

2.1 C++关键字

2.2 命名空间---解决c语言中的命名冲突

2.2.1 namespace命名空间用法

 2.2.2 :: 预作用限定符

 2.2.3 命名空间的嵌套

2.2.4  同命名空间的合并

2.2.5 命名空间的使用

2.2.5.1使用using namespace 命名空间名称 引入

2.2.5.2使用using将命名空间中某个成员引入

3.C++的输入&输出

3.1 C++输出使用:cout<<

3.2 c++的输入 

3.3 关于头文件 #include

4.结语 


1.创建第一个c++项目 

1.1项目创建

1.2 .cpp源文件建立 

1.3 第一个c++程序hello world对比c语言hello world 

二者不同的点:

 

头文件不同这个可以理解因为可能包含了我们输出输出函数的不同要包含不同的头文件,突兀的是这一行代码:

using namespace std;

这个是什么含义呢?有什么用是干什么的?这是我们进入c++的第一个问题。c++语言是c语言生长起来的, 兼容百分之九十的c语言,所以我们在c++中仍然可以使用c的代码:

只是一些细节不兼容。c++是面向对象的语言,具有泛型,弥补c语言的不足,那么这个

 using namespace std;

就是为了弥补c语言中一些命名冲突而诞生的我们称为命名空间。接下来我们就详细聊一下这个命名空间。

2.命名空间

2.1 C++关键字

关键字(keyword)属于保留字,是整个语言范围内预先保留的标识符。每个C++关键字都有特殊的含义。经过预处理后,关键字从预处理记号(preprocessing-token)中区别出来,剩下的标识符作为记号(token),用于声明对象、函数、类型、命名空间等。不能声明与关键字同名的标识符。

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

下面具体看一下:

2.2 命名空间---解决c语言中的命名冲突

在C语言中我们写下这段代码:

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

 运行:

rand是C语言中定义的一个库函数,互相冲突统一叫做命名冲突 C语言没有办法解决这种问题,只能改命名。

 

在我们输出的时候,关于rand这个变量的定义,我们的编译器会先到库函数头文件中寻找,发现是一个库函数,那么后续在遇到这个变量的定义就会报错。如果对于一个变量在库函数中找也没有找到,就会到全局变量中找,再到局部去找,都没有就会报错这个变量没有定义

那么我们的c++为了解决这个命名冲突的问题就使用了namespace这个关键字。

2.2.1 namespace命名空间用法

namespace 命名(可以自己定义,工程项目中一般是项目名)

{

//命名空间中可以是

//变量

//类型

//函数

}
 

 

namespace std//墙把这个rand围起来了,访问的就是全局的外面的,就是
	//那个rand是函数名字,不能使用%d打印,就报错是一个指针,改成P%
{
	int rand = 4;
}
namespace myadd
{
	int Add(int x, int y)
	{
		printf("%d", x + y);
		return x + y;
	}
	struct Node
	{
		struct Node* next;
		int val;
	};
}

 

现在我们打印这个rand就没有冲突报错了,但是由于此时我们自己定义的rand在命名空间中,我们编译器会首先到库函数和全局变量中寻找定义,不会访问到命名空间中的定义就不会发生冲突。rand是一个库函数的名字,是一个指针,是函数地址,所以使用%p的形式打印。

 2.2.2 :: 预作用限定符

我们通过预作用限定符号来访问命名空间中的变量和内容,方法如下:

命名空间名::内容

:: 叫做预作用限定符号

 值得注意的是:命名空间中结构体的释放有些不一样:

struct 空间名::结构体成员

 2.2.3 命名空间的嵌套

对于极端的情况,比如自己定义的变量名和自己定义的变量名冲突,这种时候可以使用命名空间的嵌套:

namespace word
{
	//极端情况,自己定义名字自己冲突怎么办
	int rand= 6;//和上面冲突,命名空间可以嵌套
	namespace word1
	{
		int rand = 8;
	}

}

2.2.4  同命名空间的合并

在一个文件中的多个位置或者多个文件中定义一个变量名的命名空间,内容会合并,同一个工程中允许存在多个相同名称的命名空间,编译器最后会合成同一个命名空间中。 

 不会冲突 多个文件或者同一文件的多个位置的同名空间编译器会合并在一个命名空间中。

 

2.2.5 命名空间的使用

第一种就是上面讲解的预作用限定符的展开方式,不过如果每次都要这样写就会很麻烦:

2.2.5.1使用using namespace 命名空间名称 引入

如果说使用namespace是建一堵围墙,将命名冲突的东西分为墙内和墙外的,如果没有预作用限定符,某认使用的就是墙外也就是命名空间外的。如果使用时:

命名空间名::内容

这样的格式使用的是墙内的。

如果使用:using namespace 命名空间这种方式,那么就相当于直接将墙推倒回到没有建围墙的时候也就是说这样在使用的时候是会有风险引起命名冲突的。

而我们的命名空间是为了防止重定义这样的错误,当没有冲突的时候这样来使用是比第一种处处都要使用::是更加方便的:

using namespace ou;展开命名空间
小测试展开可以,但是大的工程建议不展开
using namespace std
std是官方库定义的命名空间,展开就可以随便用了
但是不是随随便便的展开,防止冲突,工程项目这样不会展开,项目开发中代码较多、规模 大,就很容易出现。所以建议在项目开发中使用日常练习为了方便可以展开。
当上述两个都展开,就是库和我们定义的都展开的话,编译器会先到全局去找,找不到在依次在我们的这两个展开中去找,都找不到就报错,如果在两个地方都找到就会报冲突的错误。

每次指定命令空间很麻烦,但是展开又很危险,有冲突风险,那么我们就可以指定展开 

2.2.5.2使用using将命名空间中某个成员引入

在main函数外部使用:using 命名空间名::内容,后续使用这个内容可能会引发冲突,相当于展开了这个内容。编译器还是会优先到全局变量中去找再到这个命名空间中找,如果找到就会冲突:

using std::cout;
using std::endl;
//using stu::rand;
int rand = 10;

int main()
{
   cout << rand << endl;

指定展开后后续就可以直接用了。

3.C++的输入&输出

c++的输入输出前提:

①std

std是C++标准库的命名空间名,C++将标准库的定义实现都放到这个命名空间中

(using nameplace std 也可以只单独展开

using std::cout

using std:: endl)

②#include<iostream>

在以前,并没有命名空间这个概念,而是将标准库功能定义在全局空间里,并声明在<iostream.h>(早期的C++头文件)中。但是由于标准库非常的庞大,那么程序员在选择的类的名称或函数名时,就很有可能和标准库中的某个名字相同。所以为了避免这种情况所造成的名字冲突,就把标准库中的一切都放在一个名为std的命名空间中。后来C++标准为了和C区别开,也为了正确使用命名空间,规定头文件不使用后缀.h,即出现了现在的<iostream>头文件。

3.1 C++输出使用:cout<<

 cout是全局的流对象,是流插入运算符,在c语言中,我们通常使用“\n”来实现换行操作,在c++中不仅仅可以使用“\n',还可以使用endl。且cout是自动识别类型的。

同样的由于c++语言是c语言成长起来的,同样支持c语言的语法也就是说支持我们使用printf这样的输出。

3.2 c++的输入 

scanf使用cin代替,流提取,自动识别类型,>>是流提取运算符

3.3 关于头文件 #include<iostream>

#include<iostream>是包含在std中的,std是C++标准库的命名空间,早期标准库将所有功能在全局域中实现,声明在.h后缀的头文件中,使用时只需包含对应 头文件即可,后来将其实现在std命名空间下,为了和C头文件区分,也为了正确使用命名空间, 规定C++头文件不带.h;旧编译器(vc 6.0)中还支持格式,后续编译器已不支持,因 此推荐使用+std的方式。

  • 使用cout标准输出对象(控制台)和cin标准输入对象(键盘)时,必须包含< iostream >头文件 以及按命名空间使用方法使用std。 cout和cin是全局的流对象,endl是特殊的C++符号,表示换行输出,他们都包含在包含< iostream >头文件中。
  • << 是流插入运算符,>>是流提取运算符。
  •  使用C++输入输出更方便,不需要像printf/scanf输入输出时那样,需要手动控制格式。 C++的输入输出可以自动识别变量类型。 
  • 实际上cout和cin分别是ostream和istream类型的对象,>>和也涉及运算符重载

4.结语 

以上就是本期所有内容对于命名空间的讲解,创作不易,大家如果觉得还可以的话,欢迎大家三连,有问题的地方欢迎大家指正,一起交流学习,一起成长,我是Nicn,正在c++方向前行的奋斗者,数据结构内容持续更新中,感谢大家的关注与喜欢。

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

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

相关文章

VSCode常用修改默认设置(settings.json)

❓ 问题1 我现在在vscode中鼠标选中某个单词&#xff0c;相同的单词都会自动出现一个高亮背景色&#xff0c;我需要怎么关闭这个功能呢&#xff1f; ⚠️ 注意 selectionHighlight 这个是鼠标双击后的高亮匹配&#xff0c;可以保留默认开启的配置&#xff0c;不用去改它。 …

【Redis基础篇】详细讲解Redis

这篇文章让你详细了解Redis的相关知识&#xff0c;有代码讲解以及图片剖析&#xff0c;让你更轻松掌握 制作不易&#xff0c;感觉不错&#xff0c;请点赞收藏哟 &#xff01;&#xff01;&#xff01; 目录 1 redis基础 1.1 定义 1.2 SQL和NOSQL不同点 1.3 特征 1.4 Redis…

Electron 打包自定义NSIS脚本为安装向导增加自定义页面增加输入框

Electron 打包工具有很多&#xff0c;如Electron-build、 Electron Forge 等&#xff0c;这里使用Electron-build&#xff0c;而Electron-build使用了nsis组件来创建安装向导&#xff0c;默认情况nsis安装向导不能自定义安装向导界面&#xff0c;但是nsis提供了nsis脚本可以扩展…

探索未来外贸电商系统的创新架构

在全球化、数字化的时代背景下&#xff0c;外贸电商行业呈现出蓬勃发展的态势。为了适应市场竞争的激烈和用户需求的多样化&#xff0c;外贸电商系统的架构设计显得尤为重要。本文将深入探讨未来外贸电商系统的创新架构&#xff0c;以期为行业发展提供新的思路和方向。 随着全…

UE4_X光效果设置_法线图影响透明度

UE4_X光效果设置_法线图影响透明度 2019-03-22 13:37 Exponentin 设置轮廓光扩散度 baseReflectFactionIn 设置内部黑色的亮度值。nromal&#xff0c;连接应用一张法线图&#xff0c;Lerp两色插值&#xff0c;给两个数值&#xff0c;制造一个渐变。 法线图影响透明度&#xf…

企业邮箱给谷歌Gmail报错550-5.7.25解决方案

企业邮箱给谷歌Gmail报错550-5.7.25解决方案 问题表现 今天接到同事报告企业邮箱发送报错的问题&#xff0c;具体问题表现如下&#xff1a; 我司内部邮箱 xxXXX.com 邮箱给国内的163和新浪和企业内部发送邮件可以成功给Hotmail发送邮件&#xff0c;成功。给Gmail发送邮件&am…

蓝牙学习九(定向广播 ADV_DIRECT_IND)

一、简介 广播类型有如下&#xff1a; 非定向可连接广播&#xff08;ADV_IND&#xff09;。可连接的非定向广播&#xff0c;表示当前设备可以接受任何设备的连接请求。 定向可连接广播&#xff08;ADV_DIRECT_IND&#xff09;。可连接的定向广播&#xff0c;设备不能被主动扫描…

Python中批量修改文件名,去除某些内容

环境&#xff1a;Window10 Python3.9 PyCharm(2023.1.3) -------------------------------------****************** ** *********************----------------------------------------- 这是在Python中批量将指定文件夹下相似的文件名&#xff0c;提取文件名有效信息&am…

第二十一章 RabbitMQ

一、RabbitMQ 介绍 在介绍 RabbitMQ 之前&#xff0c;我们先来看下面一个电商项目的场景&#xff1a; - 商品的原始数据保存在数据库中&#xff0c;增删改查都在数据库中完成。 - 搜索服务数据来源是索引库&#xff08;Elasticsearch&#xff09;&#xff0c;如果数据库商品…

35.Python从入门到精通—Python CGI编程 什么是CGI

35.从入门到精通&#xff1a;Python CGI编程 什么是CGI 网页浏览 CGI架构图 Web服务器支持及配置 第一个CGI程序 HTTP头部 Python CGI编程什么是CGI网页浏览CGI架构图Web服务器支持及配置第一个CGI程序HTTP头部 Python CGI编程 什么是CGI CGI是一种通用网关接口&#xff0c;它…

Java基础 - 代码练习

第一题&#xff1a;集合的运用&#xff08;幸存者&#xff09; public class demo1 {public static void main(String[] args) {ArrayList<Integer> array new ArrayList<>(); //一百个囚犯存放在array集合中Random r new Random();for (int i 0; i < 100; …

yolov9文献阅读记录

本文记录了yolov9文献的阅读过程&#xff0c;对主要内容进行摘选翻译&#xff0c;帮助理解原理和应用&#xff0c;包括摘要、主要贡献、网络结构、主要模块&#xff0c;问题描述和试验对比等内容。 文献摘要前言摘选主要贡献相关工作可逆性结构辅助监督 问题描述信息瓶颈原理可…

windows上配置Redis主从加哨兵模式实现缓存高可用

一、哨兵模式 哨兵&#xff08;sentinel&#xff09;是Redis的高可用性(High Availability)的解决方案&#xff1a;由一个或多个sentinel实例组成sentinel集群可以监视一个或多个主服务器和多个从服务器。当主服务器进入下线状态时&#xff0c;sentinel可以将该主服务器下的某…

Appium如何自动判断浏览器驱动

问题&#xff1a;有的测试机chrome是这个版本&#xff0c;有的是另一个版本&#xff0c;怎么能让自动判断去跑呢&#xff1f;&#xff1f; 解决办法&#xff1a;使用appium的chromedriverExecutableDir和chromedriverChromeMappingFile 切忌使用chromedriverExecutableDir和c…

vue处理后端返回的日志

vue处理后端返回的日志&#xff0c;并保持日志内容最新&#xff08;滚动到最新内容&#xff09; 1、后端返回的日志格式如下所示&#xff0c;该如何处理成正常的文本换行 2、在获取日志的接口中做如下处理&#xff0c;把返回的/n替换成换行标签&#xff0c;并根据任务状态判断…

Python构建高效可扩展的Web应用程序库之aiohttp使用详解

概要 在Python异步编程领域中,aiohttp库以其强大的功能成为构建高效可扩展的Web应用程序的重要工具。它利用asyncio提供异步HTTP客户端和服务器功能,使其成为处理并发请求和优化性能的理想选择。在本全面指南中,将深入探讨aiohttp库,包括安装方法、特性、基本和高级功能、…

突破校园网限速:使用 iKuai 多拨分流负载均衡 + Clash 代理(内网带宽限制通用)

文章目录 1. 简介2. iKuai 部署2.1 安装 VMware2.2 安装 iKuai(1) 下载固件(2) 安装 iKuai 虚拟机(3) 配置 iKuai 虚拟机(4) 配置 iKuai(5) 配置多拨分流 2.3 测试速度 3. Clash 部署3.1 准备工作(1) 配置磁盘分区(2) 安装 Docker(3) 安装 Clash(4) 设置代理 1. 简介 由于博主…

DETR【Transformer+目标检测】

End-to-End Object Detection with Transformers 2024 NVIDIA GTC&#xff0c;发布了地表最强的GPU B200&#xff0c;同时&#xff0c;黄仁勋对谈《Attention is All You Need》论文其中的7位作者&#xff0c;座谈的目的无非就是诉说&#xff0c;Transformer才是今天人工智能成…

vtk,ITK,DICOM3.0

(14 封私信 / 80 条消息) VTK ITK OPENCV&#xff0c;从图像处理的角度来说&#xff0c;哪种用的人多&#xff1f; - 知乎 (zhihu.com) 医学领域&#xff1a;通常要求使用ITK和VTK。 ITK做底层处理算法。 VTK做可视化显示。 ITK:Insight Segment and Regestration Toolkit …

链表之单链表

上一篇博客我们学习了线性表中的顺序表&#xff0c;这一篇博客让我们继续往下了解线性表的链表&#xff0c;链表分为好几种结构&#xff0c;活不多说&#xff0c;让我们开始学习吧&#xff01; 目录 1.链表 2.链表的结构 3.单链表的实现 1.链表 1.概念&#xff1a;它是一种物…