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

news2024/10/7 10:13:46

目录

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++方向前行的奋斗者,数据结构内容持续更新中,感谢大家的关注与喜欢。

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

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

相关文章

SCI一区 | Matlab实现BES-TCN-BiGRU-Attention秃鹰算法优化时间卷积双向门控循环单元融合注意力机制多变量时间序列预测

SCI一区 | Matlab实现BES-TCN-BiGRU-Attention秃鹰算法优化时间卷积双向门控循环单元融合注意力机制多变量时间序列预测 目录 SCI一区 | Matlab实现BES-TCN-BiGRU-Attention秃鹰算法优化时间卷积双向门控循环单元融合注意力机制多变量时间序列预测预测效果基本介绍模型描述程序…

rasa trian 报错解决---Project validation completed with errors.

rasa train 过程中&#xff1a;出现一下问题&#xff1b; Project validation completed with errors. 解决措施:python 3.10版本&#xff0c;rasa 3.6.19, 降低版本 pip3 install rasa3.5.17 -i https://pypi.tuna.tsinghua.edu.cn/simple成功解决

Vue3:Pinia简介及环境搭建

一、简介 Pinia是Vue3中的状态管理工具&#xff0c;类似与Vue2中的Vuex框架的作用 二、环境搭建 1、安装 npm install pinia2、配置 main.ts import {createApp} from vue import App from ./App.vue // 第一步&#xff1a;引入pinia import {createPinia} from piniacons…

SWM341系列应用(SFC和SPI应用)

SWM341系列 SFC和SPI应用 1、针对具有QSPI功能的SPI-NORFLASH&#xff0c;如需要使用4线数据为&#xff08;4BIT&#xff09;方式进行读操作&#xff0c;则需要将QE位使能&#xff0c;再开启4BIT的都操作指令后进行读取。 如没有开启QE位&#xff0c;则用4BIT进行读取的数据会有…

一维卷积神经网络的特征可视化

随着以深度学习为代表的人工智能技术的不断发展&#xff0c;许多具有重要意义的深度学习模型和算法被开发出来&#xff0c;应用于计算机视觉、自然语言处理、语音处理、生物医疗、金融应用等众多行业领域。深度学习先进的数据挖掘、训练和分析能力来源于深度神经网络的海量模型…

VUE——生命周期

概念&#xff1a; mounted:挂载 new Vue({el: "#x",data: {},methods: {},mounted() {}, }) 系统会自己调用&#xff0c;不需要我们调用。 案例 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><…

go包下载时报proxyconnect tcp: dial tcp 127.0.0.1:80: connectex错误的解决方案

一大早的GoLand就开始抽风了&#xff0c;好几个文件import都红了&#xff0c;于是我正常操作点击提示的sync&#xff0c;但是却报了一堆错&#xff1a; go: downloading google.golang.org/grpc v1.61.1 go: downloading google.golang.org/genproto v0.0.0-20240228224816-df9…

荣誉 | 人大金仓连续三年入选“金融信创优秀解决方案”

3月28日&#xff0c;由中国人民银行领导&#xff0c;中国金融电子化集团有限公司牵头组建的金融信创生态实验室发布“第三期金融信创优秀解决方案”&#xff0c;人大金仓新一代手机银行系统解决方案成功入选&#xff0c;这也是人大金仓金融行业解决方案连续第三年获得用户认可。…

C++STL--排序算法

sort 使用快速排序,平均性能好O(nlogn),但最差情况可能很差O(n^2)。不稳定。 sort(v.begin(),v.end());//对v容器进行排序,默认升序 sort(v.begin(),v.end(),greater<int>());//降序排序对于支持随机访问的迭代器的容器&#xff0c; 都可以利用sort算法直接对其进行排序…

【漏洞复现】用友NC cloud uploadChunk 存在任意文件上传

0x01 阅读须知 “如棠安全的技术文章仅供参考&#xff0c;此文所提供的信息只为网络安全人员对自己所负责的网站、服务器等&#xff08;包括但不限于&#xff09;进行检测或维护参考&#xff0c;未经授权请勿利用文章中的技术资料对任何计算机系统进行入侵操作。利用此文所提供…

软考 系统架构设计师系列知识点之云原生架构设计理论与实践(13)

接前一篇文章&#xff1a;软考 系统架构设计师系列知识点之云原生架构设计理论与实践&#xff08;12&#xff09; 所属章节&#xff1a; 第14章. 云原生架构设计理论与实践 第3节 云原生架构相关技术 14.3.2 云原生微服务 1. 微服务发展背景 过去开发一个后端应用最为直接的方…

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

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

Scala第十八章节(Iterable集合、Seq集合、Set集合、Map集合以及统计字符个数案例)

Scala第十八章节 章节目标 掌握Iterable集合相关内容.掌握Seq集合相关内容.掌握Set集合相关内容.掌握Map集合相关内容.掌握统计字符个数案例. 1. Iterable 1.1 概述 Iterable代表一个可以迭代的集合, 它继承了Traversable特质, 同时也是其他集合的父特质. 最重要的是, 它定…

Python基础中易错点分享

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 一、方法当变量使用二、字符串使用1.输出一个长句子换行时&#xff0c;需要使用续行符“\”&#xff0c;否则报错2.字符串的格式化3.字符串格式化之format()函数4.浅…

肿瘤免疫反应瀑布图(源于The Miller Lab)

目录 数据格式 绘图 ①根据剂量 ②根据type ③根据治疗响应度 添加水平线 数据格式 肿瘤免疫响应数据 rm(list ls()) library(tidyverse) library(dplyr) library(knitr)#模拟数据 # We will randomly assign the two doses, 80 mg or 150 mg, to the 56 subjects Me…

【星城战记】揭秘成本控制奥秘 如何超越个人开店!

在电玩城行业的竞争中&#xff0c;成本控制和运营管理是决定企业盈利能力和生存空间的关键因素。许多投资者在选择投资项目时&#xff0c;往往忽视了这两个方面的重要性&#xff0c;导致在运营过程中遭遇重重困难。而【星城战记】作为行业内的佼佼者&#xff0c;以其卓越的成本…

ruoyi-vue-pro 前端vue js直接import导入本地文件使用方法

第一步&#xff0c;删除所有依赖&#xff0c;否则配置以后就会启动报错&#xff1a; 第二步配置对应的文件格式&#xff0c;我当前使用的是xml文件 config.module.rule(xml).test(/\.xml$/).use(xml-loader).loader(xml-loader).end();第三步重新安装所有依赖&#xff1a; …

编译 amd gpu 核心态驱动 rocm kmd linux kernel

AMD 开源了专门的 ROCm 的kmd Linux Kernel&#xff0c; 1,下载源代码 git clone --recursive https://github.com/ROCm/ROCK-Kernel-Driver.gitcd ROCK-Kernel-Driver/git checkout rocm-6.0.22,配置kernel cp -v /boot/config-$(uname -r) .config make menuconfig Graph…

Windows下Docker安装Kafka3+集群

编写 docker-compose.yaml 主要参照&#xff1a;https://www.cnblogs.com/wangguishe/p/17563274.html version: "3"services:kafka1:image: bitnami/kafka:3.4.1container_name: kafka1environment:- KAFKA_HEAP_OPTS-Xmx1024m -Xms1024m- KAFKA_ENABLE_KRAFTyes- K…

Java编程使用CGLIB动态代理介绍与实战演示

文章目录 前言技术积累核心概念主要功能适用场景与JDK动态代理的对比 实战演示定义待代理的目标类实现MethodInterceptor接口使用代理对象 测试结果写在最后 前言 在Java编程中&#xff0c;CGLIB (Code Generation Library) 是一个强大的高性能代码生成库&#xff0c;它通过生…