当前位置: 首页 > news >正文

【C++】关键字+命名空间

大家好,我是苏貝,本篇博客带大家了解C++的命名空间,如果你觉得我写的还不错的话,可以给我一个赞👍吗,感谢❤️
在这里插入图片描述


目录

  • 一. 关键字
  • 二. 命名空间
    • 2.1 命名空间的定义
    • 2.2 命名空间的使用
      • a. 命名空间名称+作用域限定符
      • b. 使用using namespace 命名空间名称引入
      • c. 使用using将命名空间中某个成员引入

一. 关键字

C++总计63个关键字,C语言32个关键字
ps:下面我们只是看一下C++有多少关键字,不对关键字进行具体的讲解。后面我们学到以后再细讲。

在这里插入图片描述

我们要知道,C++是兼容绝大部分C语言的,所以我们的C语言的代码基本上都是可以在C++环境下成功运行的

#include<iostream>
#include<stdio.h>int x = 1;int main()
{int x = 2;printf("%d\n", x);return 0;
}

看看上面的代码(不用管头文件iostream,后面会讲),最后打印的结果是1还是2呢?自然是2,因为搜索x时会采用就近原则。那我们有什么办法可以打印出全局变量x==2呢?使用域作用限定符::

#include<iostream>
#include<stdio.h>int x = 1;int main()
{int x = 2;printf("%d\n", x);printf("%d\n", ::x);return 0;
}

在这里插入图片描述

了解域作用限定符::之前,先让我们了解一下域。域是程序的一个区域,是C++提出的。C++中一共有4个域,分别是全局域,局部域,命名空间域和类域。

说回a::x,这表示x是属于::左边这个域a的,如果a为空,默认指的是全局域。所以上图的::x表示全局域中的x,所以打印出1

二. 命名空间

编译器搜索原则:
未指定域时:先在当前局部域搜索,搜不到就在全局域搜索
指定域时:只在指定的域里搜索

来看下面的代码,编译器会报错,为什么?因为rand是在头文件stdlib.h中声明的函数,又被当成全局变量,所以rand被重定义。C语言没办法解决类似这样的命名冲突问题,所以C++提出了namespace(即命名空间)来解决

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

在这里插入图片描述

2.1 命名空间的定义

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

命名空间中可以定义变量、函数和结构体

namespace hh
{int rand = 10;int Add(int a, int b){return a + b;}struct Node{struct Node* next;int val;};
}

命名空间可以嵌套

namespace N1
{int rand = 10;namespace N2{int rand = 20;}
}

同一个工程中允许存在多个相同名称的命名空间,编译器最后会合成同一个命名空间中。比如上图的命名空间N1定义在文件test.cpp中,下图的命名空间N1定义在文件test.h中,它们属于一个工程,那么最后两个N1会被合并成一个

namespace N1
{int x = 1;
}

2.2 命名空间的使用

命名空间中成员该如何使用呢?下面main函数中只写a是错误的,因为它没有指定域,所以编译器查找时先查当前局部域,没找到再找全局域,也没找到,所以报错。对于命名空间的使用,有下面3种方式

#include<iostream>
#include<stdio.h>namespace bit
{int a = 0;int b = 1;int Add(int a, int b){return a + b;}struct Node{struct Node* next;int val;};
}int main()
{//编译报错:error C2065:“a”:未声明的标识符printf("%d\n", a);return 0;
}

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

int main()
{printf("%d\n", bit::a);printf("%d\n", bit::Add(1,2));struct bit::Node phead;return 0;
}

注意,对于命名空间里的结构体的使用比较特殊

现在我们使用命名空间打印出变量rand的值,将变量放在命名空间hh中,在打印时指定域为命名空间hh,这样就只会在命名空间hh中查找rand

#include<iostream>
#include<stdio.h>namespace hh
{int rand = 10;
}int main()
{printf("%p\n", rand);printf("%d\n", hh::rand);return 0;
}

在这里插入图片描述

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

当命名空间zy和main函数在同一个项目的2个文件时,如果想使用命名空间zy的内容,我们就需要指明命名空间zy,或者展开命名空间zy

文件test.h

namespace zy
{int a = 0;int Add(int a, int b){return a + b;}struct Node{int val;struct Node* next;};
}

文件test.cpp

#include<iostream>
#include"test.h"using namespace zy;int main()
{printf("%d\n", zy::a);printf("%d\n", zy::Add(1, 2));struct zy ::Node cur;printf("%d\n", a);printf("%d\n", Add(1, 2));struct Node cur1;return 0;
}

展开命名空间就是指将访问权限打开,即本来如果不指定域的话,查找时是不会找命名空间的内容;但由于展开了命名空间zy,所以如果当前局部域没有找到,就到全局域找,全局域没有,就到已展开的命名空间zy里找

这个用法在我们平时练习时也经常用到。当我们使用c++的输入输出(cin,cout)时,需要在它们前面加命名空间std(std是C++标准库的命名空间名,C++将标准库的定义实现都放到这个命名空间中)。Endl是换行。(cin,cout,endl后面会讲)

#include<iostream>int main()
{std::cout << "hello c++" << std::endl;std::cout << "hello c++" << std::endl;std::cout << "hello c++" << std::endl;std::cout << "hello c++" << std::endl;return 0;
}

如果在我们日常练习中,这样写起来会比较麻烦。所以我们会展开命名空间std

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

注意:展开命名空间是在我们日常练习中较为常用,在实际项目中,不要展开

c. 使用using将命名空间中某个成员引入

当使用这种using将命名空间的某个成员引入时,就是打开命名空间的部分访问权限,即本来如果不指定域的话,查找时是不会找命名空间的内容;但由于展开了命名空间zy,所以如果当前局部域没有找到,就到全局域找,全局域没有,就到命名空间zy的已展开的成员里找

注意:只将某个成员引入时,using后面不需要关键字namespace

#include<iostream>using std::cout;
using std::endl;int main()
{cout << "hello c++" << endl;int i = 0;std::cin >> i;cout << i << endl;return 0;
}

好了,那么本篇博客就到此结束了,如果你觉得本篇博客对你有些帮助,可以给个大大的赞👍吗,感谢看到这里,我们下篇博客见❤️

相关文章:

【C++】关键字+命名空间

大家好&#xff0c;我是苏貝&#xff0c;本篇博客带大家了解C的命名空间&#xff0c;如果你觉得我写的还不错的话&#xff0c;可以给我一个赞&#x1f44d;吗&#xff0c;感谢❤️ 目录 一. 关键字二. 命名空间2.1 命名空间的定义2.2 命名空间的使用a. 命名空间名称作用域限定…...

网络层——IP

IP地址 结构&#xff1a; 由32位二进制数组成&#xff0c;通常用点分的形式被分为四个部分&#xff0c;每个部分1byte&#xff0c;最大值为255。 从功能的角度看&#xff0c;ip地址由两部分组成&#xff0c;网络号和主机号。网络号标识了ip所在的网段&#xff0c;主机号标识了…...

随笔 漫游互联网

网络编程基础&#xff1a;漫游互联网 温故而知新&#xff0c;可以为师矣。互联网我们可以想象成一个立体的网状结构&#xff0c;由一个一个的小网络组成的网状结构&#xff0c;在一个一个小网络中通过一台一台机器组成&#xff0c;经过几十年的发展终于有了今天这个样子。谈论…...

8.9K Star,开源自托管离线翻译引擎

Hi&#xff0c;骚年&#xff0c;我是大 G&#xff0c;公众号「GitHub 指北」会推荐 GitHub 上有趣有用的项目&#xff0c;一分钟 get 一个优秀的开源项目&#xff0c;挖掘开源的价值&#xff0c;欢迎关注。 在全球化的今天&#xff0c;跨语言交流已成为日常需求&#xff0c;然…...

MySQL基础之DML

MySQL基础之DML 语法不区分大小写 分类 DD(definition)L 定义DM(manipulation)L 操作DQ(query)L 查询DC(control)L 控制 添加数据 # 指定字段添加数据(一条)insert into 表名(字段1,字段2,...) values(值1,值2,...);# 全部字段添加数据(一条)insert into 表名 values(值1,值…...

男单新老对决:林诗栋VS马龙,巅峰之战

听闻了那场激动人心的新老对决&#xff0c;不禁让人热血沸腾。在这场乒乓球的巅峰之战中&#xff0c;林诗栋与马龙的对决无疑是一场视觉与技术的盛宴。 3:3的决胜局&#xff0c;两位选手的每一次挥拍都充满了策略与智慧&#xff0c;他们的每一次得分都让人心跳加速。 林诗栋&am…...

Java如何判断堆区中的对象可以被回收了?

如何判断堆区中的对象可以被回收了 在Java中&#xff0c;垃圾回收机制会帮助我们自动回收不再被使用的对象&#xff0c;已到达即使释放内存的效果&#xff0c;但是Java又是怎么知道哪些对象不会再被我们继续使用了呢&#xff0c;希望你通过本篇文章&#xff0c;理解引用计数法与…...

.Net 6.0 监听Windows网络状态切换

上次发了一个文章获取windows网络状态&#xff0c;判断是否可以访问互联网。传送门&#xff1a;获取本机网络状态 这次我们监听网络状态切换&#xff0c;具体代码如下&#xff1a; public class WindowsNetworkHelper {private static Action<bool>? _NetworkStatusCh…...

UE4 材质学习笔记01(什么是着色器/PBR基础)

1.什么是shader 着色器是控制屏幕上每个像素颜色的代码&#xff0c;这些代码通常在图形处理器上运行。 现如今游戏引擎使用先进的基于物理的渲染和照明。而且照明模型模型大多数是被锁定的。 因此我们创建着色器可以控制颜色&#xff0c;法线&#xff0c;粗糙度&#xff0c;…...

算法 | 位运算(哈希思想)

位运算 &与两个位都为1时&#xff0c;结果才为1&#xff08;有0为0&#xff09;|或两个位都为0时&#xff0c;结果才为0&#xff08;有1为1&#xff09;^异或两个位相同为0&#xff0c;相异为1~取反0变1&#xff0c;1变0<<左移各二进位全部左移若干位&#xff0c;高…...

前端提升方向

1、脚手架配置&#xff1a;首先你会发现&#xff0c;一旦团队项目里多个项目之间的配置或者规范不同步&#xff0c;那么每个项目的配置都需要手动修改&#xff0c;而这很浪费时间。所以&#xff0c;你可以发起了一个团队的脚手架项目&#xff0c;把项目中的代码规范、Vite 配置…...

深度学习基础—残差网络ResNets

1.残差网络结构 当网络训练的很深很深的时候&#xff0c;效果是否会很好&#xff1f;在这篇论文中&#xff0c;作者给出了答案&#xff1a;Deep Residual Learning for Image Recognitionhttps://www.cv-foundation.org/openaccess/content_cvpr_2016/papers/He_Deep_Residual_…...

鸿蒙ArkUI实战开发-主打自研语言及框架

ArkUI 是 HarmonyOS 的声明式 UI 开发框架&#xff0c;而 ArkUI-X 是基于 ArkUI 框架扩展而来的跨平台开发框架。ArkUI-X 支持 HarmonyOS、OpenHarmony、Android 和 iOS 平台&#xff0c;允许开发者使用一套代码构建支持多平台的应用程序。 一、ArkUI-X 的实战开发步骤 在实战开…...

HDU Sit sit sit (区间DP+组合数)

题目大意&#xff1a;有 n 张椅子&#xff0c;n 个人&#xff0c;所有人都可以按照任意顺序坐在任意一张椅子上&#xff0c;但是同时满足这三种情况的椅子不能坐&#xff1a; 1.椅子上有左右两张相邻的椅子。 2.左右相邻的椅子不是空的。 3.左右相邻的椅子颜色不同。 如果当前学…...

Qt开发技巧(十四)文字的分散对齐,设置动态库路径,进度条控件的文本,文件对话框的卡顿,滑块控件的进度颜色,停靠窗体的排列,拖拽事件的坑

继续讲一些Qt开发中的技巧操作&#xff1a; 1.文字的分散对齐 有时候需要对文本进行分散对齐显示&#xff0c;相当于无论文字多少&#xff0c;尽可能占满整个空间平摊占位宽度&#xff0c;但是在对支持对齐方式的控件比如QLabel调用 setAlignment(Qt::AlignJustify | Qt::Align…...

VirtulBOX Ubuntu22安装dpdk23.11

目录 依赖包安装 Python安装 numa安装 ​编辑Python pip3安装 ​编辑pyelftools安装 meson和ninja安装 ​编辑构建与编译 Meson构建DPDK ​编辑Ninja安装DPDK ​编辑VFIO-PCI驱动安装 大页内存和IOMMU配置 ​编辑VFIO-PCI加载 ​编辑VFIO-PCI驱动绑定 ​编辑dpdk…...

线性代数书中求解齐次线性方程组、非齐次线性方程组方法的特点和缺陷(附实例讲解)

目录 一、克拉默法则 1. 方法概述 2. 例16(1) P45 3. 特点 (1) 只适用于系数矩阵是方阵 (2) 只适用于行列式非零 (3) 只适用于唯一解的情况 (4) 只适用于非齐次线性方程组 二、逆矩阵 1. 方法概述 2. 例16(2) P45 3. 特点 (1) 只适用于系数矩阵必须是方阵且可逆 …...

初识算法 · 双指针(2)

目录 前言&#xff1a; 盛最多水的容器 题目解析&#xff1a; 算法原理&#xff1a; 算法编写&#xff1a; 有效三角形的个数 题目解析&#xff1a; 算法原理&#xff1a; 算法编写&#xff1a; 前言&#xff1a; 本文介绍两个题目&#xff0c;盛最多水的容器和有效三…...

React常见面试题目

React常见面试题目详解包括以下几个方面&#xff1a; 1. 对React的理解及特性 定义与用途&#xff1a;React是一个用于构建用户界面的JavaScript库&#xff0c;它遵循组件设计模式、声明式编程范式和函数式编程概念&#xff0c;使得前端应用程序更高效。 核心特性&#xff1a; …...

图解网络OSI模型与TCP/IP

一、OSI模型与TCP/IP 1、OSI模型 OSI/RM&#xff08;Open System Interconnection&#xff0c;开放系统互联参考模型&#xff09;是由ISO&#xff08;国际标准组织&#xff09;创建的一个有助于开放和理解计算机的通信模型&#xff0c;OSI七层参考模型作为一套规范的标准&…...

铭豹扩展坞 USB转网口 突然无法识别解决方法

当 USB 转网口扩展坞在一台笔记本上无法识别,但在其他电脑上正常工作时,问题通常出在笔记本自身或其与扩展坞的兼容性上。以下是系统化的定位思路和排查步骤,帮助你快速找到故障原因: 背景: 一个M-pard(铭豹)扩展坞的网卡突然无法识别了,扩展出来的三个USB接口正常。…...

Python:操作 Excel 折叠

💖亲爱的技术爱好者们,热烈欢迎来到 Kant2048 的博客!我是 Thomas Kant,很开心能在CSDN上与你们相遇~💖 本博客的精华专栏: 【自动化测试】 【测试经验】 【人工智能】 【Python】 Python 操作 Excel 系列 读取单元格数据按行写入设置行高和列宽自动调整行高和列宽水平…...

在HarmonyOS ArkTS ArkUI-X 5.0及以上版本中,手势开发全攻略:

在 HarmonyOS 应用开发中&#xff0c;手势交互是连接用户与设备的核心纽带。ArkTS 框架提供了丰富的手势处理能力&#xff0c;既支持点击、长按、拖拽等基础单一手势的精细控制&#xff0c;也能通过多种绑定策略解决父子组件的手势竞争问题。本文将结合官方开发文档&#xff0c…...

将对透视变换后的图像使用Otsu进行阈值化,来分离黑色和白色像素。这句话中的Otsu是什么意思?

Otsu 是一种自动阈值化方法&#xff0c;用于将图像分割为前景和背景。它通过最小化图像的类内方差或等价地最大化类间方差来选择最佳阈值。这种方法特别适用于图像的二值化处理&#xff0c;能够自动确定一个阈值&#xff0c;将图像中的像素分为黑色和白色两类。 Otsu 方法的原…...

华为OD机试-食堂供餐-二分法

import java.util.Arrays; import java.util.Scanner;public class DemoTest3 {public static void main(String[] args) {Scanner in new Scanner(System.in);// 注意 hasNext 和 hasNextLine 的区别while (in.hasNextLine()) { // 注意 while 处理多个 caseint a in.nextIn…...

【python异步多线程】异步多线程爬虫代码示例

claude生成的python多线程、异步代码示例&#xff0c;模拟20个网页的爬取&#xff0c;每个网页假设要0.5-2秒完成。 代码 Python多线程爬虫教程 核心概念 多线程&#xff1a;允许程序同时执行多个任务&#xff0c;提高IO密集型任务&#xff08;如网络请求&#xff09;的效率…...

Java编程之桥接模式

定义 桥接模式&#xff08;Bridge Pattern&#xff09;属于结构型设计模式&#xff0c;它的核心意图是将抽象部分与实现部分分离&#xff0c;使它们可以独立地变化。这种模式通过组合关系来替代继承关系&#xff0c;从而降低了抽象和实现这两个可变维度之间的耦合度。 用例子…...

Go语言多线程问题

打印零与奇偶数&#xff08;leetcode 1116&#xff09; 方法1&#xff1a;使用互斥锁和条件变量 package mainimport ("fmt""sync" )type ZeroEvenOdd struct {n intzeroMutex sync.MutexevenMutex sync.MutexoddMutex sync.Mutexcurrent int…...

基于PHP的连锁酒店管理系统

有需要请加文章底部Q哦 可远程调试 基于PHP的连锁酒店管理系统 一 介绍 连锁酒店管理系统基于原生PHP开发&#xff0c;数据库mysql&#xff0c;前端bootstrap。系统角色分为用户和管理员。 技术栈 phpmysqlbootstrapphpstudyvscode 二 功能 用户 1 注册/登录/注销 2 个人中…...

Linux系统部署KES

1、安装准备 1.版本说明V008R006C009B0014 V008&#xff1a;是version产品的大版本。 R006&#xff1a;是release产品特性版本。 C009&#xff1a;是通用版 B0014&#xff1a;是build开发过程中的构建版本2.硬件要求 #安全版和企业版 内存&#xff1a;1GB 以上 硬盘&#xf…...