C++入门:命名空间与输入输出

目录

1.命名空间

1.1 命名空间的定义

1.2 命名空间的使用

1.3 标准命名空间 std

2.C++输入输出


我们在初学C++时,经常会在代码开头看到这样的一行代码:

using namespace std;

这行代码到底什么意思呢?我们学完命名空间就可以理解了。

1.命名空间

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

什么意思呢,我们来看下面代码:

#include<stdio.h>
#include<stdlib.h>//rand()函数在里面//命名冲突
int rand = 0;int main()
{printf("%d\n", rand);return 0;
}
//编译后会报错:error C2365: “rand”: 重定义;以前的定义是“函数”

因为在 stdlib.h 头文件中包含随机数函数rand(),这里rand有两个,一个是你定义的全局变量rand,还有一个是函数指针rand,会发生rand重定义,命名冲突,报错。C语言没有办法解决类似这样的命名冲突问题,所以C++提出了namespace来解决,只需给自己定义的rand加上一个命名空间即可。

1.1 命名空间的定义

定义命名空间,需要使用到namespace关键字,后面跟命名空间的名字,自己定义,然后接一对{}即可,{}中即为命名空间的成员。

1.正常的命名空间的定义

namespace xlh
{//命名空间可以定义变量,函数,类型int rand = 0;int Add(int left, int right){return left + right;}struct Node{struct Node* next;int val;};}

2.命名空间可以嵌套

namespace xlh
{int a = 0;int b = 0;int Add(int left, int right){return left + right;}//嵌套定义命名空间xxxnamespace xxx{int rand = 1;}
}

3. 同一个工程中允许存在多个相同名称的命名空间,编译器最后会合成到同一个命名空间中。

namespace xlh
{//命名空间可以定义变量,函数,类型int a = 0;int Add(int left, int right){return left + right;}
}namespace xlh
{int b = 0;	
}

注意:一个命名空间就定义了一个新的作用域,命名空间中的所有内容都局限于该命名空间中。

1.2 命名空间的使用

命名空间的成员该如何使用呢?

namespace xlh
{// 命名空间中可以定义变量/函数/类型int a = 0;int b = 1;int Add(int left, int right){return left + right;}struct Node{struct Node* next;int val;};
}int main()
{// 编译报错:error C2065: “a”: 未声明的标识符printf("%d\n", a);return 0;
}

 命名空间使用的三种方式:

1. 加命名空间名称作用域限定符::

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

加命名空间与不加命名空间的区别 :

  • 不加命名空间  默认情况下只会在全局查找 不会在命名空间里面查找
  • 加命名空间只会在命名空间里面查找
namespace s
{//命名空间可以定义变量,函数,类型int rand = 0;int Add(int left, int right){return left + right;}struct Node{struct Node* next;int val;};namespace xxx{int rand = 1;}
}int Add(int left, int right)
{return (left + right) * 10;
}int main()
{printf("%p\n", rand);//全局rand()是函数指针printf("%d\n", s::rand);//不加命名空间  默认情况下只会在全局查找 不会在命名空间里面查找printf("%d\n", Add(1, 2));//加命名空间只会在命名空间里面查找printf("%d\n", s::Add(1, 2));//结构体类型 命名空间放在结构体名字前面struct s::Node node;return 0;
}

 2.使用using将命名空间中的成员引入

//部分展开(授权) 也不能重命名 不用每次调用都写命名空间
using xlh::b;
int main()
{printf("%d\n", xlh::a);printf("%d\n", b);//b不需要写命名空间return 0;
}

3.使用using namespace 命名空间名称 引入

//展开命名空间(全部展开(授权)) 相当于命名空间失效,用起来方便,不需要加命名空间
using namespce xlh;
int main()
{printf("%d\n", xlh::a);//命名空间可写可不写printf("%d\n", a);printf("%d\n", b);Add(10, 20);return 0;
}

1.3 标准命名空间 std

在C++中,每个头文件中都会使用了命名空间,名字为std,头文件的内容在命名空间std内,因为命名空间相同会合并,引用多个头文件时不会冲突。

std是C++标准库的命名空间,C++标准库的定义和实现都会放到这个命名空间里面去,然后会合并,避免使用者定义的东西与C++库里的定义的名称发生冲突。

如果我们要使用标准命名空间内的东西,可以加命名空间std::,或者自是简单的练习C++,可以全部展开:

using namespace std;

std命名空间的使用惯例:

std是C++标准库的命名空间,如何展开std使用更合理呢?

  1. 在日常练习中,建议直接using namespace std即可,这样就很方便。
  2.  using namespace std展开,标准库就全部暴露出来了,如果我们定义跟库重名的类型/对象/函数,就存在冲突问题。该问题在日常练习中很少出现,但是项目开发中代码较多、规模大,就很容易出现。所以建议在项目开发中使用,像std::cout这样使用时指定命名空间 或using std::cout;展开常用的库对象/类型等方式。

2.C++输入输出

新生婴儿会以自己独特的方式向这个崭新的世界打招呼,C++刚出来后,也算是一个新事物,那C++是否也应该向这个美好的世界来声问候呢?我们来看下C++是如何来实现问候的。

#include<iostream>
// std是C++标准库的命名空间名,C++将标准库的定义实现都放到这个命名空间中
using namespace std;
int main()
{cout << "Hello world!!!" << endl;return 0;
}

说明:

  1. 使用cout标准输出对象(控制台)cin标准输入对象(键盘)时,必须包含< iostream >头文件以及按命名空间使用方法使用std。
  2.  cout和cin是全局的流对象,endl是特殊的C++符号,表示换行输出,他们都包含在包含<iostream >头文件中。
  3. <<是流插入运算符,>>是流提取运算符
  4. 使用C++输入输出更方便,不需要像printf/scanf输入输出时那样,需要手动控制格式。C++的输入输出可以自动识别变量类型。
  5. 实际上cout和cin分别是ostream和istream类型的对象,>>和<<也涉及运算符重载等知识,这些知识我们我们后续才会学习所以我们这里只是简单学习他们的使用。后面我们还有有一个章节更深入的学习IO流用法及原理。

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

示例:

#include <iostream>
using namespace std;
int main()
{int a;double b;char c;// 可以自动识别变量的类型cin>>a;cin>>b>>c;cout<<a<<endl;cout<<b<<" "<<c<<endl;return 0;
}

关于cout和cin还有很多更复杂的用法,比如控制浮点数输出精度,控制整形输出进制格式等
等。因为C++兼容C语言的用法,使用C语言写法就可以,这些又用得不是很多,我们这里就不展开学习了。

本篇结束。 

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

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

相关文章

Redis进阶底层原理- Redis结构图与底层数据编码结构

Redis底层原理篇&#xff0c;​让学习绚丽多彩起来&#xff01;&#xff01;&#xff01;&#xff08;需要原图私信&#xff09;

四川天蝶电子商务:2023短视频运营分析

短视频运营分析是指通过对短视频平台上的各种数据进行收集、整理和分析&#xff0c;以寻找出视频内容、用户活跃度、用户行为等方面的规律和问题&#xff0c;从而为短视频平台的运营决策提供依据。下面将从几个方面具体介绍短视频运营分析的重要性和方法。 首先&#xff0c;短…

无涯教程-PHP - 常量声明

常量值不能更改。默认情况下&#xff0c;常量区分大小写。按照约定&#xff0c;常量标识符始终为大写。与变量不同&#xff0c;您不需要具有"$"的常量。 constant 函数 如名称所示&#xff0c;此函数将返回常量的值。 当您要检索常量的值但不知道其名称时&#xf…

Linux grep命令详细教程

简介 Linux grep命令是一种非常常用的文本搜索工具&#xff0c;它可以在给定的文件中搜索匹配的字符串&#xff0c;并输出匹配的行。grep是全称“global search regular expression print”&#xff0c;可以识别正则表达式&#xff0c;并使用正则表达式进行搜索。 选项 以下…

windows搭建WebDAV服务,并内网穿透公网访问【无公网IP】

windows搭建WebDAV服务&#xff0c;并内网穿透公网访问【无公网IP】 文章目录 windows搭建WebDAV服务&#xff0c;并内网穿透公网访问【无公网IP】1. 安装IIS必要WebDav组件2. 客户端测试3. cpolar内网穿透3.1 打开Web-UI管理界面3.2 创建隧道3.3 查看在线隧道列表3.4 浏览器访…

【旅游度假】Axure酒店在线预订APP原型图 旅游度假子模块原型模板

作品概况 页面数量&#xff1a;共 10 页 兼容软件&#xff1a;Axure RP 9/10&#xff0c;不支持低版本 应用领域&#xff1a;旅游度假&#xff0c;生活服务 作品申明&#xff1a;页面内容仅用于功能演示&#xff0c;无实际功能 作品特色 本作品为「酒店在线预订」的移动端…

RS232、RS422、RS485硬件及RS指令、RS2指令应用知识学习

RS232、RS422、RS485硬件及RS指令、RS2指令应用知识学习 一、串行&#xff08;异步/同步)通讯、并行通讯、以太网通讯 二、单工通讯/半双工通讯/双工通讯 三、常用硬件接口&#xff08;工业上基本是RS485两线制的接线&#xff09; 常用硬件接口RS232/RS422/RS485&#xff0c;…

BC96 有序序列判断

描述 输入一个整数序列&#xff0c;判断是否是有序序列&#xff0c;有序&#xff0c;指序列中的整数从小到大排序或者从大到小排序(相同元素也视为有序)。 数据范围&#xff1a;3≤n≤50 序列中的值都满足1≤val≤100。 输入描述 第一行输入一个整数N(3≤N≤50)。 第二行…

《知识图谱与大模型融合实践研究报告》发布,创邻科技参编

近期&#xff0c;第三届知识图谱产业发展论坛暨知识图谱与大模型融合研讨会在北京召开。会上&#xff0c;《知识图谱与大模型融合实践研究报告》正式发布&#xff01; 该白皮书是由中国电子技术标准化研究院依托知识图谱产业推进方阵、全国信标委人工智能分委会知识图谱工作组…

⛳ TCP 协议面试题

目录 ⛳ TCP 协议面试题&#x1f43e; 一、为什么关闭连接的需要四次挥⼿&#xff0c;⽽建⽴连接却只要三次握⼿呢&#xff1f;&#x1f3ed; 二、为什么连接建⽴的时候是三次握⼿&#xff0c;可以改成两次握⼿吗&#xff1f;&#x1f463; 三、为什么主动断开⽅在TIME-WAIT状态…

spring boot 3使用 elasticsearch 提供搜索建议

业务场景 用户输入内容&#xff0c;快速返回建议&#xff0c;示例效果如下 技术选型 spring boot 3elasticsearch server 7.17.4spring data elasticsearch 5.0.1elasticsearch-java-api 8.5.3 pom.xml <dependency><groupId>org.springframework.boot</gr…

iotdb查询结果集转换为java对象

iotdb查询结果集转换为java对象 百度文心 未使用插件 要将IoTDB查询结果集转换为Java对象&#xff0c;您需要编写Java代码以解析查询结果并将其转换为相应的Java对象。 以下是一个示例代码&#xff0c;可以将IoTDB查询结果集转换为Java对象&#xff1a; import java.io.IOEx…

节点不连续伽辽金方法在求解线性和非线性平流方程中的一维实现(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

可视化绘图技巧100篇进阶篇(九)-三维百分比堆积条形图(3D Stacked Percentage Bar Chart)

目录 前言 适用场景 绘图工具及代码实现 帆软 实现思路 方案一:使用计算指标 上传数据

Hyperledger Fabric的使用及开发

Hyperledger Fabric是Linux基金会发起的一种跨行业的区块链技术&#xff0c;目前在多家大型公司有着应用&#xff0c;这里就不多做HF本身的介绍了&#xff0c;有兴趣可关注其官网。 1. 准备工作&#xff1a; 开始前需要一定的准备工作&#xff0c;安装各类中间件&#xff1a;…

微服务中间件--Nacos

Nacos 1. Nacos入门a.服务注册到Nacosb.Nacos服务分级存储模型c.NacosRule负载均衡d.服务实例的权重设置e.环境隔离 - namespacef.Nacos和Eureka的对比 2. Nacos配置管理a.统一配置管理b.配置热更新c.多环境配置共享 1. Nacos入门 Nacos是阿里巴巴的产品&#xff0c;现在是Spr…

基于MongoDB的空间数据存储与查询

一、概念说明 1.1 空间地理数据 MongoDB 中使用 GeoJSON对象 或 坐标对 描述空间地理数据。MongoDB使用 WGS84 参考系进行地理空间数据查询。 1、MongoDB支持空间数据的存储&#xff0c;数据类型需要限制为GeoJSON; 2、MongoDB可以为GeoJSON类型数据建立索引&#xff0c;提升空…

在jupyter notebook中使用海龟绘图

首先&#xff0c;安装ipyturtle3 ref:ipyturtle3 PyPI pip install ipyturtle3然后&#xff0c;安装ipycanvas ipycanvas是一个需要安装在与JupyterLab实例相同环境的包。此外&#xff0c;您需要安装nodejs&#xff0c;并启用JupyterLab ipycanvas小部件。 所有这些都在ipy…

ARM--day7(cortex_M4核LED实验流程、异常源、异常处理模式、异常向量表、异常处理流程、软中断编程、cortex_A7核中断实验)

软中断代码&#xff1a;&#xff08;keil软件&#xff09; .text .global _start _start:1.构建异常向量表b resetb undef_interruptb software_interruptb prefetch_dataabortb data_abortb .b irqb fiq reset:2.系统一上电&#xff0c;程序运行在SVC模式1>>初始化SVC模…

Oracle 中 ROWNUM 使用问题记录

ROWNUM 使用问题记录(2023-08-17) Oracle 版本&#xff1a; 19.0.0.0.0 Enterprise现象&#xff1a;今天在项目遇到一个问题&#xff0c;测试人员反馈前一天能看到的数据今天看不到了 用表格举例&#xff0c;这是前一天看到的数据&#xff0c;有9、7、1 这几个数量信息 日期…