C++——命名空间

在这里插入图片描述

c++ ——命名空间

  • 前言
  • 一.命名空间
    • 命名空间的进一步拓展
  • 二.io流特性

前言

**
Alt

好久不见,甚是想念~今天我们讲解的是关于c++命名空间的一些知识点,这只是开胃小菜哦,期待我们后面更深入知识的灵魂碰撞吧

**

一.命名空间

怎么形容呢~命名空间出现的情况有两种:

第一种就是自命名的变量与封存在std库函数命名冲突了。(std相当于是c++标准库里包含了c++所有的函数与对象名,std本身也是命名空间)

第二种就是自命名变量互相冲突了。这种发生场景很常见,无论是与别人对接工作又或是参照对方源代码都会出现这种情况。

#include <stdio.h>
#include <stdlib.h>
//命名变量与库里的函数名冲突
int rand = 0;

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

在这里插入图片描述
在C语言中是无法解决该问题的,所以这也使得在C++改进此问题。

怎么说呢~就比如有一个人偶叫壮壮,它是早在洪荒之初(std库)就被定义的。后来呢又出现了一个人偶也叫壮壮,只不过这个人偶是我们人工捏造的(自命名变量)。那就导致命名冲突了,因为编译器看着两个壮壮不知道到底要用哪个。在它的视野里两人都叫壮壮,没有区分。

#include <stdio.h>
#include <stdlib.h>
namespace lj
{
	int rand = 0;
}

int main()
{
	//::域作用限定符
	printf("%d\n", lj::rand);
	return 0;
}

而命名空间要做的就是把其中一个人偶关在一个房间里,让外面的那个使系统默认只能看到它,那么系统就会默认使用它。那么关在房间里的呢需要一把钥匙,只有找到钥匙才可以让系统看到被关在里面的它并使用它。(而lj::就是我们所在命名空间的钥匙)

有了命名空间可以很好地解决上述两种情况。

命名空间的进一步拓展

namespace lj
{
	int rand = 0;
	int Add(int x, int y)
	{
		return x + y;
	}
}

int main()
{
	printf("%d\n", lj::rand);
	lj::Add(1, 2);
	return 0;
}

命名空间也同样可以对函数使用,不过得注意若想用自己写的函数需要一把钥匙(lj::)。

namespace lj
{
	int rand = 0;
	int Add(int x, int y)
	{
		return x + y;
	}
	struct Node
	{
		struct Node* node;
		int val;
	};
}

int main()
{
	printf("%d\n", lj::rand);
	lj::Add(1, 2);
	//用结构体定义一个节点
	struct lj::Node node;
	return 0;
}

命名空间对结构体同样适用,需要注意的是lj::是要放到命名变量的前面,不能放到struct前面。

namespace lj
{
	namespace lj1
	{
		int rand = 0;
	}
	namespace lj2
	{
		int rand = 1;
	}
	int Add(int x, int y)
	{
		return x + y;
	}
	struct Node
	{
		struct Node* node;
		int val;
	};
}

int main()
{
	printf("%d\n", lj::lj1::rand);
	printf("%d\n", lj::lj2::rand);
	lj::Add(1, 2);
	//用结构体定义一个节点
	struct lj::Node node;
	return 0;
}

命名空间还有一个特性,当有多个命名相同的变量时命名空间可以嵌套。(虽然感觉日常不会用到)

**

还有一个小知识点,举例我们在和对接工作时都用到了自己写的栈函数,但我们又不想去用他的,如何避免这种情况发生呢?我们可以用命名空间把所声明的栈与定义的栈都包含起来,后面在用的时候用这把钥匙开门就能找到我们所写的栈了。不用担心2个命名空间相同,因为在.h与.cpp分别有相同的命名空间时,最后相同命名空间会汇总在一起的。

**

在这里插入图片描述

不过有了命名空间感觉好麻烦,为了能够避免命名冲突我们需要在每一次通过钥匙才能用到我们想要的变量,虽然这样很安全,但是在测试时还是很不方便的,毕竟我们是自己测试,不用与其他人对接。

using namespace lj;
int main()
{
	//lj::ST s;

	ST s;
	StackInit(&s);
	StackPush(&s, 1);
	StackPush(&s, 2);
	StackPush(&s, 3);
	StackPush(&s, 4);

	return 0;
}

我们需要有一种可以改变编译器默认选择的方法,使得每次运行的时候都默认优先选择我们所在的命名空间的变量,而非std库里面默认定义的变量。usingnamespace lj——解放命名空间。

*那么在这里我们就可以理解using namespace std的用途了,它是C++官方库定义的命名空间,也因此作为编译器默认选择的对象(说是默认,其实只不过是变为全局变量),这样库里的东西就随便用了。

不过命名空间还是不要随随便便展开,std之所以封起来就是防止我们所命名的变量与库里冲突。

*总结起来就是收纳盒理论,平时封装好的函数都存在std收纳盒中,当我们要使用它时就得把收纳盒的东西倒出来这样才可以找到,因为在收纳盒的掩盖下我们的全局视野里是不会看到那个我们需要用的对象的。

二.io流特性

就像我们一开始学习c语言的输入(scanf)与输出(printf)一样,在开启c++的学习之前我们也要认识属于c++的输入与输出。当然c++能够兼容99%的c语言特性,我们可以视情况灵活运用。
在使用io流特性之前需要引入头文件:#include

不过cout与cin封存在std里在全局变量是默认找不到的,所以我们需要using namespace std或者std::cout指定使用。
在这里插入图片描述
流插入我们可以理解为从外部发出电波给到b,而流提取就是从b里面提取数据并打印出来。

相较于c语言的优点就是在输入输出的时候不用去在意变量的类型,什么%d,%lf等等通通不用管。它会自动去识别变量类型。

当然也有不足之处,在我们需要控制浮点数精度时反而很麻烦,这时候倒不如直接用printf来得简单。

在这里插入图片描述
除此之外,换行的方式也具有多种。

有一个问题,每次指定命名空间很麻烦,展开又危险。这就引申出命名空间的第三种用途:指定命名展开。

using std::cout;
using std::endl;

int main()
{
	cout << "hello world\n";
	cout << "hello world"<<"\n";
	cout << "hello world" << endl;
	return 0;
}
​​​​​​

​​​​​​​​​​​​​​​​​​​​

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

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

相关文章

网络编程--tcp三次握手四次挥手

1、三次握手 &#xff08;1&#xff09;三次握手的详述 首先Client端发送连接请求报文&#xff0c;Server段接受连接后回复ACK报文&#xff0c;并为这次连接分配资源。Client端接收到ACK报文后也向Server段发生ACK报文&#xff0c;并分配资源&#xff0c;这样TCP连接就建立了。…

数据结构--顺序表和链表的区别

顺序表和链表之间各有优劣&#xff0c;我们不能以偏概全&#xff0c;所以我们在使用时要关注任务的注重点&#xff0c;以此来确定我们要使用两者中的哪一个。 不同点&#xff1a; 存储空间上&#xff1a; 顺序表在物理结构上是一定连续的&#xff0c;而链表(这里以带头双向循环…

DS:顺序表、单链表的相关OJ题训练(2)

欢迎各位来到 Harper.Lee 的学习世界&#xff01; 博主主页传送门&#xff1a;Harper.Lee的博客主页 想要一起进步的uu欢迎来后台找我哦&#xff01; 一、力扣--141. 环形链表 题目描述&#xff1a;给你一个链表的头节点 head &#xff0c;判断链表中是否有环。如果链表中有某个…

Web前端开发 小实训(三) 商品秒杀小练习

学生能够在本次实训中完成商品秒杀页面的基本逻辑 任务要求 能够实现某一个商品的秒杀&#xff0c;在倒计时结束后不再进行秒杀。 操作步骤 1、打开预设好的页面 <html><head><meta charset"utf-8"><title>秒杀</title><link …

vue + element-plus 开发中遇到的问题

1.问题之路由守卫 初写路由守卫&#xff0c;对于next()的理解不是很透彻&#xff0c;就想着都放行&#xff0c;不然看不到效果&#xff0c;结果控制台出现了警告&#xff0c;想着报黄的问题就不是问题&#xff0c;但仔细一看发现他说&#xff0c;如果再生产阶段就会失败&#x…

【问题分析】锁屏界面调起google语音助手后壁纸不可见【Android 14】

1 问题描述 为系统和锁屏分别设置两张不同的壁纸&#xff0c;然后在锁屏界面长按Power调起google语音助手后&#xff0c;有时候会出现壁纸不可见的情况&#xff0c;如以下截图所示&#xff1a; 有的时候又是正常的&#xff0c;但显示的也是系统壁纸&#xff0c;并非是锁屏壁纸…

【用文本生成歌声】Learn2Sing 2.0——歌声转换算法及梅尔频谱详解

一. 频谱图与梅尔谱图的介绍 频谱图&#xff1a;频谱图可以理解为一堆垂直堆叠在一起的快速傅里叶变换结果。 1.1 信号 在进入频谱图模块之前&#xff0c;首先我们需要了解信号是什么。 信号就是某一特定量随时间变化&#xff0c;对于音频来说&#xff0c;这个特定的变化量就…

韩顺平0基础学Java——第8天

p155-168 数组&#xff08;第六章&#xff09; 数组可以存放多个同一类型的数据&#xff0c;数组也是一种数据类型&#xff08;引用类型&#xff09;。 即&#xff0c;数组就是一组数据~ 例&#xff1a;double [] hens {1,2,3,4,5,6}; 新建了一组鸡&#xff0c;里面有6个。…

代码随想录算法训练营第36期DAY18

DAY18 二叉树的层序遍历 102二叉树的层序遍历 “队列先进先出&#xff0c;符合一层一层遍历的逻辑&#xff0c;而用栈先进后出适合模拟深度优先遍历也就是递归的逻辑。” 二叉树层序遍历模版&#xff1a; /** * Definition for a binary tree node. * struct TreeNode { *…

PostgreSQL的学习心得和知识总结(一百四十二)|深入理解PostgreSQL数据库数据库之 Continuous Integration

目录结构 注&#xff1a;提前言明 本文借鉴了以下博主、书籍或网站的内容&#xff0c;其列表如下&#xff1a; 1、参考书籍&#xff1a;《PostgreSQL数据库内核分析》 2、参考书籍&#xff1a;《数据库事务处理的艺术&#xff1a;事务管理与并发控制》 3、PostgreSQL数据库仓库…

办公技巧之合集文档 拆分_word

问题 如何将文档合集拆分为单独文档。 操作步骤 软件 word 365 原理简述&#xff1a; 在 word 大纲视图下&#xff0c;通过一级标题确定子文档范围&#xff0c;然后导出即可。 文档结构 从下图可见&#xff0c;文档结构为已建立大纲级别的文档&#xff0c;如果没有建立&a…

每日一题——力扣27. 移除元素(举一反三)

题目链接&#xff1a;https://leetcode.cn/problems/remove-element/description/ 菜鸡写法&#xff1a; // 函数定义&#xff0c;移除数组nums中所有值为val的元素&#xff0c;并返回新的数组长度 int removeElement(int* nums, int numsSize, int val) {// 如果数组长度为…

Steam游戏搬砖,不说破万,月入5K没问题

steam游戏搬砖项目的玩法就是打汇率差&#xff0c;在steam平台购买道具&#xff0c;挂在网易buff上出售&#xff0c;通过汇率差盈利。一天交易几百美金的道具&#xff0c;大概能搞到200块左右的利润&#xff0c;而且平台是支持这样交易的&#xff0c;还很稳定。目前最主流的游戏…

设计模式1——初步认识篇

设计模式1——初步认识篇 一、先让我们浅聊一下面向对象和设计模式。 说起设计模式&#xff0c;我第一次听到它&#xff0c;是在学习面向对象的时候。那么什么是面向对象&#xff0c;什么是设计模式&#xff0c;而且设计模式和面向对象又有什么关系呢&#xff1f; 1、什么是面…

im8mm 网络卡死 Rx packets:1037578 errors:66 dropped:0 overruns:66 frame:0

1&#xff1a;网络接收数据包异常 2&#xff1a;问题复现 问题在进行网络数据包同吞吐量测试的时候出现的。同时发现&#xff0c;在使用iperf2测试时&#xff0c;是不会出现网络中断卡死的情况&#xff0c;使用 iperf3时才会出现此问题 指令(下面的指令运行在PC2上面&#xff…

十二种网络威胁防护方案

一、SQL注入 SQL注入即是指web应用程序对用户输入数据的合法性没有判断或过滤不严&#xff0c;攻击者可以在web应用程序中事先定义好的查询语句的结尾上添加额外的SQL语句&#xff0c;在管理员不知情的情况下实现非法操作&#xff0c;以此来实现欺骗数据库服务器执行非授权的任…

kali linux更新卡在libc6:amd64 (2.37-15)

适配于linux的windows子系统,wsl2,安装kali linux,运行 sudo apt update 卡在:Setting up libc6:amd64 (2.37-15) … 关机重启、重新修复执行也不行 解决办法:kill当前apt进程或者关机重启kali-linux,然后执行: ssudo mv /usr/sbin/telinit /usr/sbin/telinit.baksu…

安装docker镜像nginx1.26.0版本,与删除docker容器【灵异事件】

为了http3 的这个模块&#xff0c;所以需要升级nginx的版本&#xff0c;需要nginx1.26.0才有 –with-http_v3_module 这个模块 为什么记录一下&#xff1f;因为觉得奇怪 1&#xff1a;删除nginx镜像&#xff0c;显示镜像还被某个容器在使用 luichunluichun:~$ docker rmi ng…

数电——集成计数器

分析 &#xff08;1&#xff09;74161 4位同步&#xff08;cp相同&#xff09;二进制&#xff0c;模16&#xff08;2的4次方&#xff09; 逻辑符号 端口 D0,D1,D2,D3为输入信号 Q0,Q1,Q2,Q3为输出信号 RCO输出进位标志&#xff1a;记满16个数后&#xff0c;输出1 P,T 控…

番外篇 | 利用PyQt5+YOLOv5来搭建目标检测系统(附可视化界面+功能介绍+源代码)

前言:Hello大家好,我是小哥谈。PyQt5是一个Python绑定的Qt库,是用于创建图形用户界面(GUI)和其他应用程序组件的工具包。PyQt5提供了许多GUI元素,如按钮、文本框、标签等,也提供了许多Qt的功能,如网络、数据库、XML等。通过PyQt5可以在Python中使用Qt的丰富功能和强大的工…