【C++入门必备知识:命名空间与关键字】

news2024/11/15 5:08:16

【C++入门必备知识:命名空间与关键字】

  • 【命名空间】
    • ①.命名空间定义
        • Ⅰ.正常定义命名空间
        • Ⅱ.嵌套定义命名空间
        • Ⅲ.合并命名空间
    • ②.命名空间的使用
        • Ⅰ.+命名空间名称及域作用限定符
        • Ⅱ.using成员引入
        • Ⅲ.using namespace名称全部引入
    • ③.注意事项
  • 【C++关键字(C++98)】

在这里插入图片描述

【命名空间】

在C/C++中,变量,函数和类都是大量存在的,而这些变量,函数,和类的名称都将存在全局作用域中,这样可能就回引起很多冲突:比如命名冲突。

  • 命名冲突
    1.我们跟库冲突
    2.我们互相之间冲突

而我们使用命名空间的目的就是为了解决C语言大多缺陷<命名冲突>。
使用命名空间可以对标识符的名称进行本地化,从而避免命名冲突或名字污染。

1.编译器访问域顺序 --局部域>全局域–>展开命名空间域or指令访问命名空间域。
2.命名空间展开就是展开到全局里来,是编译器是否会到命名空间域中访问搜索。

#include <stdio.h>
#include <stdlib.h>
int rand = 10;
int main()
{
 printf("%d\n", rand);
return 0;
}
//比如我们在这里定义一个全局变量rand,想要打印rand。
//但是编译器会报错,因为显示重定义。
为什么呢?因为引用了头文件后,头文件里就有rand函数的定义,在头文件里rand定义为函数,而在这里又被定义为全局变量,所以产生了命名冲突。

由于在C语言中该类问题无法解决,所以在C++中提出了使用namespace来解决

①.命名空间定义

库里的名称我们无法改变,那我们可以将自己定义的名称放在命名空间里,当需要时指令访问即可。
那怎么定义命名空间呢?

定义命名空间,需要使用关键字namespace,后面跟着命名空间名子,然后再接着一个{}即可。
{}里即为命名空间的成员,可以是变量,函数,类。

namespace定义的命名空间就相当于定义一个域–可以与其他域隔离。也就是将自己定义的变量,函数,类,划到一个新的域中,让全局域找不到自己。

常见域:
1.类域
2.命名空间域
3.局部域
4.全局域

Ⅰ.正常定义命名空间

namespace wei
{
	int a = 10;//可以定义变量
	
	int Add(int x, int y)//可以定义函数
	{
		return x + y;
	}

	struct Node//可以定义类
	{
		int data;
		struct Node* next;
	};
}

Ⅱ.嵌套定义命名空间

命名空间是可以嵌套的
比如C++库名字就叫std里面就嵌套着许多命名空间。

namespace tao1
{
	int a = 10;
	int b = 20;
	namespace tao2
	{
		int a = 1;
		int b = 2;
		namespace tao3
		{
			int a = 3;
			int b = 4;
		}
	}
}

Ⅲ.合并命名空间

在不同的头文件里,最后同名的命名空间会合并成一个。

也就是在同一个工程中允许多个相同名称的命名空间,编译器最后会合成同一个命名空间中的

在这里插入图片描述

//test.cpp文件
namespace tao1
{
	int a = 10;
	int b = 20;
	namespace tao2
	{
		int a = 1;
		int b = 2;
		namespace tao3
		{
			int a = 3;
			int b = 4;
		}
	}
}
//test.h文件
namespace tao1
{
	int max;
	int min;
	int a = 10;
	int b=30;
}

②.命名空间的使用

定义好命名空间后,我们可以在命名空间里定义我们想要定义的变量,函数,类,并且不需要担心和库里函数发生命名冲突。
不过当我们要使用这些命名空间里的成员时,该如何使用呢?

::域作用限定符

Ⅰ.+命名空间名称及域作用限定符

namespace wei
{
	int a = 10;//可以定义变量
	
	int Add(int x, int y)//可以定义函数
	{
		return x + y;
	}

	struct Node//可以定义类
	{
		int data;
		struct Node* next;
	};
}
int main()
{
	printf("%d", wei::a);//加命名空间名称与域作用限定符
	return 0;
}

Ⅱ.using成员引入

namespace wei
{
	int a = 10;//可以定义变量
	
	int Add(int x, int y)//可以定义函数
	{
		return x + y;
	}

	struct Node//可以定义类
	{
		int data;
		struct Node* next;
	};
}
using wei::Add;//使用using将命名空间中某个成员引入。
int main()
{
	printf("%d\n", wei::a);
	printf("%d\n", Add(2, 5));
	return 0;
}

Ⅲ.using namespace名称全部引入

namespace wei
{
	int a = 10;//可以定义变量
	
	int Add(int x, int y)//可以定义函数
	{
		return x + y;
	}

	struct Node//可以定义类
	{
		int data;
		struct Node* next;
	};
}

using namespace wei;//使用using namespace命名空间名称将命名空间内容全部展开。
int main()
{
	printf("%d\n", wei::a);
	printf("%d\n", Add(2, 5));
	struct Node n;
	return 0;
}

但这种做法是有风险的。

③.注意事项

当我们使用第三种方法来访问命名空间里的成员时,会存在风险,因为命名空间全部展开到全局域中,就又会出现命名冲突的风险。比如如果全部展开C++标准库就会存在风险。

  • using namespace std;
    1.直接展开会有风险:当我们定义如果和库重名那就会报错
    2.建议项目里面不要直接展开,建议日常练习可以直接展开
    3.项目中建议指定展开,不要轻易展开命名空间。

不过我们还可以这样:

如果有重复多使用的可以【部分展开】:【指定展开】:【把常用的展开】

using std::cout;//将常用的成员展开使用
using std::end1;//将常用的成员展开使用

【C++关键字(C++98)】

C++关键字总计为63个,C语言总计32个关键字。

在这里插入图片描述

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

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

相关文章

Ubuntu系统安装docker、docker-compse

环境&#xff1a;Ubuntu 20.04.4 LTS (GNU/Linux 5.4.0-100-generic x86_64) 一、安装docker 1.卸载旧版本 ubuntu下自带了docker的库&#xff0c;不需要添加新的源。 但是ubuntu自带的docker版本太低&#xff0c;需要先卸载旧的再安装新的 sudo apt-get remove docker docke…

免费的语音转文字软件有哪些?推荐一款好用的

随着人工智能技术的不断发展&#xff0c;语音识别技术已经得到了广泛的应用。语音转文字软件是其中的一种应用&#xff0c;它能够将人们说出的话语自动转化为文字&#xff0c;从而方便人们进行文本处理、记录、存档等操作。在现实生活中&#xff0c;有很多人需要使用语音转文字…

Redis的哈希表是如何扩容的?

文章目录 一般面试回答哈希表结构字典数据结构解决哈希冲突扩容/缩容对字典的哈希表rehash步骤 渐进式rehash渐进式rehash步骤 相关问题 一般面试回答 redis 解决冲突的方法是使用链地址法&#xff0c;另外当容量不足的时候&#xff0c;则使用Rehash 进行扩容。 Rehash&#x…

96-Linux_UDP实现客户端和服务器端

UDP实现客户端和服务器端 一.udp实现客户端和服务器端的编程流程二.udp实现实现客户端和服务器端所用的接口1.socket2.sendto3.recvfrom 三.udp服务器端代码和客户端的代码1.服务器端2.客户端 一.udp实现客户端和服务器端的编程流程 udp提供无链接的,不可靠的,数据报服务; 二…

burp suite 插件编写-基础

文章目录 前言一、插件的官方文档二、Montoya API jar包结构三、HTTP 处理程序小结 四、代码示例 前言 burp插件入门。入门&#xff0c;我们大概有一个框架&#xff0c;心里不再有怎么做&#xff0c;为什么可以这么做的疑问。现在就要更具体的来回答“怎么做”这个问题。我们通…

基于C#编程建立泛型Vector数据类型及对应处理方法

目录 一、简介 二、方法 2.1 建立Vector类 2.2 Vector成员 2.3 Vector属性 2.4 Vector方法 2.4.1 构造函数 2.4.2 Vector元素操作方法 2.4.3 Vector 运算 三、调用方法 3.1 方法 3.1.1 Append 3.1.2 this[] 3.1.3 Insert 3.1.4 DelLen 3.1.5 FindNumber 3.1.6 …

PHP快速入门04-前后端数据交互与文件上传

文章目录 前言前后端数据交互与文件上传前后端数据交互 $_GET $_POST文件上传 总结 前言 本文已收录于PHP全栈系列专栏&#xff1a;PHP快速入门与实战 前后端数据交互与文件上传 前后端数据交互 $_GET $_POST 他们都是超全局变量。它们用于从HTTP请求中获取数据&#xff0…

除了学历,你更需要有能力

遥想当年&#xff0c;家里培养出一个大学生&#xff0c;是多荣耀的事&#xff01;可现今却处于一个比较尴尬的状态。 为什么大学生贬值得这么厉害&#xff1f;其实大学生之所以会不值钱不外乎三大原因&#xff1a;量大、与企业需求不匹配、质量差。 高校扩招下&#xff0c;大…

OpenAI最新官方ChatGPT聊天插件接口《接入插件快速开始》全网最详细中英文实用指南和教程,助你零基础快速轻松掌握全新技术(二)(附源码)

Getting started 快速开始 前言Introduction 导言Plugin manifest 插件清单OpenAPI definition OpenAPI定义Running a plugin 运行插件Setup a local proxy of your public API 设置公共API的本地代理 Writing descriptions 书写描述Best practices Debugging 排除故障其它资料…

【Android】popup windows 的使用方式 和 遇到不显示的坑

背景 在项目开发过程中有一个需求就是点击一个问号icon 弹出相关提示信息在下面&#xff0c;那么就得对这个做适配了。 计划采用popupWindow 实现&#xff1a; 参考 实现 基本的套路就是写一个xml对应的布局&#xff0c;然后在java 层使用即可。 特别注意的是该xml布局要慎…

ubuntu输入法问题汇总

Xfce4桌面环境输入法 Ubuntu20.04、ubuntu21.04中安装xfce4桌面环境&#xff0c;自带中文输入法&#xff1b; 原生xubuntu20.04中文输入法问题解决办法&#xff1a; 更新语言支持失败的话&#xff0c;终端键入&#xff1a;sudo apt-get install cmake qt5-default qtcreator…

网络安全——传输层安全协议(3)

作者简介&#xff1a;一名云计算网络运维人员、每天分享网络与运维的技术与干货。 座右铭&#xff1a;低头赶路&#xff0c;敬事如仪 个人主页&#xff1a;网络豆的主页​​​​​​ 目录 前言 一.SSL密钥更改协议 二.SSL告警协议 关闭报警 错误报警 三.SSL协议安全性…

软件测试测试开发技能

从事软件测试许多年&#xff0c;想必很多人都有感到迷茫不知所措的时候&#xff0c;人生的十字路口有很多&#xff0c;该如何抉择呢&#xff1f;有人成功转型&#xff0c;QA、项目管理、配置管理。当然还有技术型&#xff0c;性能测试、自动化测试、测试开发&#xff0c;而想要…

爬虫JS逆向思路-hook钩子

网络上几千块都学不到的JS逆向思路这里全都有&#x1f44f;&#x1f3fb;&#x1f44f;&#x1f3fb;&#x1f44f;&#x1f3fb; 本系列持续更新中&#xff0c;三连关注不迷路&#x1f44c;&#x1f3fb; 干货满满不看后悔&#x1f44d;&#x1f44d;&#x1f44d; &…

连续3天3场分享,KubeVela@KubeCon EU 2023 抢鲜看!

自从 2019 年 Open Application Model 诞生以来&#xff0c;KubeVela 已经经历了几十个版本的变化&#xff0c;并向现代应用程序交付先进功能的方向不断发展。最近&#xff0c;KubeVela 完成了向 CNCF 孵化项目的晋升&#xff0c;标志着社区的发展来到一个新的里程碑。今天&…

有了MySQL,为什么还要有NoSQL

&#x1f3c6;今日学习目标&#xff1a; &#x1f340;MySQL和NoSQL的区别 ✅创作者&#xff1a;林在闪闪发光 ⏰预计时间&#xff1a;30分钟 &#x1f389;个人主页&#xff1a;林在闪闪发光的个人主页 &#x1f341;林在闪闪发光的个人社区&#xff0c;欢迎你的加入: 林在闪闪…

PYQT5学习笔记02——程序基本结构之面向对象版本

我们之前写的代码耦合性比较高&#xff0c;复用性不高&#xff0c;这是面向过程编程的缺点。我们可以把程序基本结构设计成面向对象的版本&#xff0c;把 设置控件这部分内容封装到一个类中。 比如这个是我们的窗口&#xff0c;红色的矩形是相同的菜单控件&#xff0c;既然是一…

研报精选230420

目录 【行业230420浙商证券】卫浴行业深度报告&#xff1a;智能卫浴新变局&#xff0c;国货崛起正当时 【行业230420平安证券】氢能全景图&#xff08;上&#xff09;制氢篇&#xff1a;商业模式起步&#xff0c;绿氢初试锋芒 【行业230420天风证券】建筑装饰行业深度研究&…

InstructGPT:Training language models to follow instrcutions with human feedback

InstructGPT&#xff1a;Training language models to follow instrcutions with human feedback 介绍模型数据集TaskHuman data collectionmodel 实验结果参考 介绍 现在LLM可以被prompt来完成一系列的下游任务&#xff0c;然而这些模型也总会产生一些用户不想要的结果&#…

ESP32 WiFi扫描、WiFi通道查询

ESP32WiFi扫描程序 代码解决什么问题&#xff1f; 扫描周围WiFi并识别指定WiFi名称的WiFi通道&#xff08;为了ESP32的esp-now协议正常通信&#xff09;。 这跟ESP32 now有什么关系&#xff1f; ESP32使用NOW协议进行通信时&#xff0c;要求参与通信的设备必须处于同一物理…