C++入门学习(1)命名空间和输入输出

前言

        在C语言和基本的数据结构学习之后,我们终于迎来了期待已久的C++啦!C++发明出来的意义就是填补一些C语言的不足,让我们更加方便的写代码,所以今天我们就来讲一下C语言不足的地方和在C++中的解决办法!

一、命名空间

        在学习命名空间这个概念之前,我们先来看下面这段代码:

在这段代码中,我们定义了一个rand变量,但是我们还知道,rand又是stdlib这个头文件里面的函数名,理应来说应该会命名冲突的,但是我们不要忘了,这里的变量rand是局部变量,当命名冲突的时候,会优先调用局部变量,所以下面程序会正常打印4

        那什么情况下会命名冲突呢?我们接着往下看!

#include <stdio.h>
#include <stdlib.h>
int main()
{int rand = 4;printf("%d\n",rand);return 0;
}

        看这段代码,当我们把rand定义成全局变量的时候就会产生命名冲突了,这个程序无法正常执行下去了,那就会有小面包们问(作者喜欢叫读者为小面包),我们难道不可以自己来避免这个命名冲突的问题吗?就不用函数名就得了!可是大家想想,库里面很多函数,我们无法保证在未来写代码的时候,定义的变量名一定不跟函数名冲突,所以这个时候我们的命名空间这个概念就诞生了,那就让我们开始学习C++的第一课----命名空间吧!

#include <stdio.h>
#include <stdlib.h
int rand = 4;
int main()
{printf("%d\n",rand);return 0;
}

二、命名空间的概念

我们的命名空间,其实就是给我们定义的变量围上一堵墙,我们需要用的时候,就可以去调用这个命名空间,这跟我们C语言的结构体类似,就是把这些变量划分到命名空间里了,防止跟外面的产生命名冲突。也像给变量贴上个标签,告诉程序,这个是我的,不是函数名!

三、命名空间的定义

我们还需要知道在C++里面是可以写C的程序的,来一起看下面这段代码,命名空间的关键字就是namespace,后面再加上命名空间的名字,就是起个名字,随便起,推荐大家起名字的缩写,表明这里面的变量都是自己的,那我们定义完命名空间之后该如何调用呢?

#include <iostream> // C++里面的标准输入输出库
#include <stdio.h> // C的标准输入输出
namespace xmb
{int rand = 3;
}
int main()
{printf("%d\n",xmb::rand);return 0;
}

四、 命名空间的内容

命名空间里面可以放变量和函数体,结构体,联合体等数据类型,使用的时候就用上面的调用规则就可以了!

#include <iostream>
namespace xmb
{int rand = 12;int Add(int x, int y){return x + y;}struct List{int a;int b;char c;};union room{int a;int b;char c;};
}
int main()
{xmb::rand = 3;int num = xmb::Add(3,5);struct xmb::List la = {1,2,'a'};la.b = 3;la.c = 4;la.c = 'b';union xmb::room uroom = {3};uroom.a = 4;uroom.b = 3;uroom.c = 'a';return 0;
}

五、命名空间的嵌套

我们的命名空间是可以嵌套的,我们可以嵌套多个命名空间,在调用的时候就依次来就可以。

namespace xmb
{int rand = 12;namespace xmb1{int Add(int x, int y){return x + y;}namespace xmb11{int num = 10;}}namespace xmb2{struct List{int a;int b;char c;};}namespace xmb3{union room{int a;int b;char c;};}
}
int main()
{xmb::xmb1::xmb11::num = 20;return 0;
}

六、命名空间在多文件中的应用

既然命名空间如此的好用,那它在多文件中是否可以应用呢?

答案是可以的,但是也有限制规则

头文件:

#include <iostream>namespace xmb
{typedef struct List{int* data;int size;int capacity;}SL;void SLInit(SL* phead);void SLPush(SL* phead,int num);
}

函数体:

#include "test.h"
namespace xmb
{void SLInit(SL* phead){phead->data = nullptr;phead->size = 0;phead->capacity = 0;}void SLPush(SL* phead,int num ){//}
}

我们在多文件的时候,命名空间一定要保持一致,

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

比如上面的test.h和上面test.cpp中两个xmb会被合并成一个。

七、命名空间的调用方式

1. 命名空间名称 ➕ :: ➕ 变量名

如图,我们需要调用rand这个变量,只需要如下的调用我们就可以使用了!再也不用担心会命名冲突了!

注意!!!⚠️

只要是跟库里面的函数名冲突了,就用这种方法,其他两种解决不了!

#include <iostream> // C++里面的标准输入输出库
#include <stdio.h> // C的标准输入输出
namespace xmb
{int rand = 3;
}
int main()
{printf("%d\n",xmb::rand);return 0;
}

2. using➕命名空间名称➕::➕变量名

#include <iostream> // C++里面的标准输入输出库
#include <stdio.h> // C的标准输入输出
namespace xmb
{int a = 3;int b = 6;
}
using xmb::a;
int main()
{printf("%d\n",a);printf("%d\n",xmb::b);return 0;
}

3. using namespace ➕ 命名空间名称

这个主要就是引入了命名空间,写完这个就可以直接调用命名空间里面的内容

#include <iostream> // C++里面的标准输入输出库
#include <stdio.h> // C的标准输入输出
namespace xmb
{int a = 3;int b = 6;
}
using namespace xmb;
int main()
{printf("%d\n",a);printf("%d\n",b);return 0;
}

八、C++中的输入输出

大家在学习完命名空间之后,肯定会想,C++的输入输出还是跟C语言的一样吗?还是有自己更好的输入输出语句?

答案是有更好的!接下来我们就介绍C++的输入输出!

1. cout :类似C语言中的printf函数,是标准的输出到控制台/终端上,

2. cin :类似C语言中的scanf函数,是标准的输入,从键盘上输入到变量。

3. << :流插入运算符,配合cout使用

4. >> :流提取运算符,配合cin使用

5. endl :特殊的C++符号,表示换行输出

我们的cout,cin和endl都在std这个命名空间里,而std命名空间在<iostream>这个头文件里,所以我们要使用的时候必须同时调用std和<iostream>它们两个。

8.1 cout的使用

这里就代表从右往左依次流入到cout(控制台/终端)上,先输出hello world 再输出换行

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

8.2 cin的使用

cin这里就是从左往右依次输入,输入第一个值给a,空格或者换行,输入第二个值给b

#include <iostream>
using namespace std;
int main()
{int a = 0;int b = 0;cin >> a >> b;cout<< a << endl << b << endl;return 0;
}

注意⚠️!!!

使用C++输入输出更方便,不需要像printf/scanf输入输出时那样,需要手动控制格式。

C++的输入输出可以自动识别变量类型

#include <iostream>
using namespace std;
int main()
{int a = 0;double b = 0;char c = 0;cin >> a >> b >> c;cout<< a << endl << b << endl << c << endl;return 0;
}

九、std命名空间的使用惯例

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

1. 在日常练习中,建议直接using namespace std即可,这样就很方便。

#include <iostream>
using namespace std;
int main()
{int a = 0;double b = 0;char c = 0;cin >> a >> b >> c;cout<< a << endl << b << endl << c << endl;return 0;
}

2.但是 using namespace std 展开,标准库就全部暴露出来了,如果我们定义跟库重名的类型/对象/函数,就存在冲突问题。

该问题在日常练习中很少出现,但是项目开发中代码较多、规模大,就很容易出现。

所以我们不要展开全部,仅仅引用cou,cin和endl就可以了!

#include <iostream>using std::cout;
using std::cin;
using std::endl;int main()
{int a = 0;double b = 0;char c = 0;cin >> a >> b >> c;cout<< a << endl << b << endl << c << endl;return 0;
}

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

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

相关文章

如何避免 JavaScript 中的内存泄漏?

一、什么是内存泄漏&#xff1f; JavaScript 就是所谓的垃圾回收语言之一&#xff0c;垃圾回收语言通过定期检查哪些先前分配的内存仍然可以从应用程序的其他部分“访问”来帮助开发人员管理内存。垃圾回收语言中泄漏的主要原因是不需要的引用。如果你的 JavaScript 应用程序经…

Linux应用开发基础知识——交叉编译与gcc编译(一)

前言&#xff1a; 源文件需要经过编译才能生成可执行文件。在 Windows 下进行开发时&#xff0c;只需 要点几个按钮即可编译&#xff0c;集成开发环境(比如 Visual studio)已经将各种编译 工具的使用封装好了。Linux 下也有很优秀的集成开发工具&#xff0c;但是更多的时候是 直…

基于野马算法的无人机航迹规划-附代码

基于野马算法的无人机航迹规划 文章目录 基于野马算法的无人机航迹规划1.野马搜索算法2.无人机飞行环境建模3.无人机航迹规划建模4.实验结果4.1地图创建4.2 航迹规划 5.参考文献6.Matlab代码 摘要&#xff1a;本文主要介绍利用野马算法来优化无人机航迹规划。 1.野马搜索算法 …

章鱼网络进展月报 | 2023.10.1-10.31

章鱼网络大事摘要 1、Louis 成功竞选 NDC 的 HoM 议席&#xff0c;将会尽最大努力推动 NEAR 变革。2、章鱼网络受邀参加在土耳其主办的 Cosmoverse2023&#xff0c;分享 Adaptive IBC 的技术架构。3、2023年10月8日章鱼日&#xff0c;是章鱼网络主网上线2周年的纪念日。 …

运维知识点-MySQL从小白到入土

MySQL从小白到入土 mysql 服务器安装windows mysql 服务漏洞复现-mysql jdbc反序列化-权限绕过 mysql 服务器安装 https://dev.mysql.com/downloads/mysql/https://www.cnblogs.com/xiaostudy/p/12262804.html 点餐小程序腾讯云服务器安装mysql8 windows mysql 服务 net sta…

2023年【高压电工】报名考试及高压电工最新解析

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 高压电工报名考试考前必练&#xff01;安全生产模拟考试一点通每个月更新高压电工最新解析题目及答案&#xff01;多做几遍&#xff0c;其实通过高压电工作业考试题库很简单。 1、【单选题】 ()是指继电器不动作时处于…

register_parameter和register_buffer 详解

在参考yolo系列代码或其他开源代码&#xff0c;经常看到register_buffer和 register_parameter的使用&#xff0c;接下来将详细对他们进行介绍。 1. 前沿 在搭建网络时&#xff0c;我们 自定义的参数&#xff0c;往往不会保存到模型权重文件中&#xff0c;或者成为模型可学习…

“轻松管理收支明细,随时筛选借款信息,财务清晰无忧“

作为现代人&#xff0c;我们每天都在与金钱打交道。无论是个人还是企业&#xff0c;都需要对收支情况进行详细的管理和分析。然而&#xff0c;繁琐的财务数据往往让人头疼。现在&#xff0c;我们为您推荐一款强大的财务管理工具&#xff0c;让您轻松管理收支明细&#xff0c;随…

超越 GLIP! | RegionSpot: 识别一切区域,多模态融合的开放世界物体识别新方法

本文的主题是多模态融合和图文理解&#xff0c;文中提出了一种名为RegionSpot的新颖区域识别架构&#xff0c;旨在解决计算机视觉中的一个关键问题&#xff1a;理解无约束图像中的各个区域或patch的语义。这在开放世界目标检测等领域是一个具有挑战性的任务。 关于这一块&…

Android可绘制资源概览(背景、图形等)

关于作者&#xff1a;CSDN内容合伙人、技术专家&#xff0c; 从零开始做日活千万级APP。 专注于分享各领域原创系列文章 &#xff0c;擅长java后端、移动开发、商业变现、人工智能等&#xff0c;希望大家多多支持。 目录 一、导读二、概览三、drawable 分类3.1 Bitmap fileXML …

速学数据结构 | 链表实现队列究竟有什么优势?

&#x1f3ac; 鸽芷咕&#xff1a;个人主页 &#x1f525; 个人专栏:《速学数据结构》 《C语言进阶篇》 ⛺️生活的理想&#xff0c;就是为了理想的生活! &#x1f4cb; 前言 &#x1f308;hello&#xff01; 各位宝子们大家好啊&#xff0c;栈区的实现我们前面已经讲了&#…

shell学习脚本05(小滴课堂)

可以对海量的数据进行提取。 -v对提取的内容进行取反。 -n显示出行号。 -w精确匹配&#xff1a; -i:忽略大小写&#xff1a; -E正则匹配&#xff1a; cut命令&#xff1a; -d指定分隔符&#xff0c;-f指定截取区域&#xff1a; 截取第一列到第三列&#xff1a; 截取第二列到最…