【C++杂货铺】快速学会命名空间

目录

🌈前言

📁 命名空间的定义

📁 命名空间的使用

● 加命名空间名称及作用域限定符

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

● 使用using namespace 命名空间名称 引入

📁 C++输入 和 输出

📁 总结


🌈前言

        欢迎收看本期【C++杂货铺】,这期内容,我们将围绕C++中内存空间进行讲解。如果你想学习C++,或者刚学完C语言衔接C++,那么这篇文章将会非常有效的帮助你理解。

        在C语言学习过程中,我们知道同一个作用域下是不能创建同名的变量/函数/结构体的,问题就来了,随着我们不断学起,代码越写越多,让我们起这么多名也不行呀。这时,C++ 的开发者本贾尼·斯特劳斯特卢普就想到了一种方法,就是命名空间,不同命名空间的对象是可以同名的。

📁 命名空间的定义

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

拓:

        C++中域分为 全局域,局部域,命名空间域,类域。目前,如果你还没学习过C++,你只需先了解前三个域即可,类域会在后面的【C++杂货铺讲解】。

        编译器想要搜索一个变量/函数时,规则如下:

        1. 首先查找局部域

        2. 在查找去全局域

        3. 如果上述操作后,依然没有找到没报错,如果你指定了命名空间,那么编译器会跳过上述步骤,直接进入命名空间进行查找。

        如何指定一个命名空间呢,就要用到操作符 :: ,即域作用限定符

        下面,我们来举一个例子,C语言环境下有一个rand函数,是用来生成伪随机数的一个函数,包含在<stdlib.h>这个头文件中,如果我们想用在创建一个变量rand,会发现,编译器会报错。

#include <stdio.h>
#include <stdlib.h>
int rand = 10;
// C语言没办法解决类似这样的命名冲突问题,所以C++提出了namespace来解决
int main()
{
 printf("%d\n", rand);
return 0;
}
// 编译后后报错:error C2365: “rand”: 重定义;以前的定义是“函数”

        倘若你使用C++来编写代码,你就可以创建个命名空间将rand变量放入进去。

#include <iostream>
namespace test
{
	int rand;
}
int main()
{
	test::rand = 0;
	return 0;
}

        以上就是命名空间的应用场景,即避免了同名变量/函数的冲突问题。下面我们来看看命名空间如何创建使用。

📁 命名空间的使用

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

//1. 命名空间中可以定义变量/函数/类型
namespace N1
{
    int a;
    int add(int x,int y)
    {
        return x + y;
    }

    struct Node
    {
        struct Node* next;
        int val;
    }
}

//2. 命名空间可以嵌套
namespace N1
{
    int a;
    int b;
    int Add(int x, int y)
     {
         return left + right;
     }
    namespace N2
     {
         int c;
         int d;
         int Sub(int x, int y)
         {
             return x - y;
         }
     }
}

//3. 同一个工程中允许存在多个相同名称的命名空间,编译器最后会合成同一个命名空间中。
// test.h
namespace N1
{
    int Mul(int x, int y)
     {
         return x * y;
     }
}

        以上我们就学会了如何创建命名空间,那么如何去使用呢。倘若不加任何东西,是不能直接使用的,正如们上面拓展所讲,编译器会在局部和全局域中搜索,没有指定命名空间会报错。

#include <iostream>

namespace N
{
    int a = 10;
    int b = 20;
}

int main()
{
 // 编译报错:error C2065: “a”: 未声明的标识符
 printf("%d\n", a);
return 0;
}

● 加命名空间名称及作用域限定符

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

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

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

● 使用using namespace 命名空间名称 引入

using namespce N;
int main()
{
    printf("%d\n", N::a);
    printf("%d\n", b);
    Add(10, 20);
    return 0;    
}

📁 C++输入 和 输出

        以上,我们就对命名空间有了了解,这也方便你更好的理解下面的内容。我们首先来看看C++中如何输出"Hello World ",当然你也可以是使用纯C写printf函数,也可以使用cout。

#include <iostream>

using namespace std;
// std是C++标准库的命名空间名,C++将标准库的定义实现都放到这个命名空间中

int main()
{
    cout<<"Hello World" <<endl;
}

//using std::cout

//std::cout<<"Hello World" <<endl;

拓:

1. 使用 cout 标准输出对象 ( 控制台 ) cin 标准输入对象 ( 键盘 ) 时,必须 包含 < iostream > 头文件以及按命名空间使用方法使用std
2. cout cin 是全局的流对象, endl 是特殊的 C++ 符号,表示换行输出,他们都包含在包含 <
iostream > 头文件中。
3. << 是流插入运算符, >> 是流提取运算符
4. 使用 C++ 输入输出更方便,不需要像 printf/scanf 输入输出时那样,需要手动控制格式。
C++ 的输入输出可以自动识别变量类型。

        也就是说cin 和 cout 都是在std这个命名空间里的。如果不是用usingnamespace std的话,可以using每个成员变量,或者+上域作用限定符 :: 。最后的endl就是输出换行的意思,类似与'\n'的功能。

📁 总结

        总结一下,我们这期内容讲了什么是命名空间,它的作用就是避免命名冲突,如何去定义命名空间,如要注意的是同一个命名空间是不能有同名的变量/函数/结构体对象的,此外,我们还对cin和cout进行了讲解。

stdC++标准库的命名空间,如何展开std使用更合理呢?
1. 在日常练习中,建议直接 using namespace std 即可,这样就很方便。
2. using namespace std 展开,标准库就全部暴露出来了,如果我们定义跟库重名的类型 /
/ 函数,就存在冲突问题。该问题在日常练习中很少出现,但是项目开发中代码较多、规模
大,就很容易出现。所以建议在项目开发中使用,像 std::cout 这样使用时指定命名空间 +
using std::cout 展开常用的库对象 / 类型等方式。
最后,如果感觉本期【C++杂货铺】—— 命名空间 (解决命名冲突等问题) 对你有帮助,欢迎点赞,收藏,关注Thanks♪(・ω・)ノ

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

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

相关文章

微信小程序首页、界面布局、功能简洁(示例三)

微信小程序首页界面布局、页面简洁&#xff0c;功能简单 直接上具体代码&#xff1a; 1、js代码 Page({/*** 页面的初始数据*/data: {imgList: [../../images/demo.jpg, ../../images/demo.jpg, ../../images/demo.jpg],navList: [{src: ../../images/nav1.png,title: 菜单一}…

《统计学习方法:李航》笔记 从原理到实现(基于python)-- 第 2章感知机

文章目录 第 2章感知机2.1 感知机模型2.2 感知机学习策略2.2.1 数据集的线性可分性2.2.2 感知机学习策略 2.3 感知机学习算法2.3.1 感知机学习算法的原始形式2.3.2 算法的收敛性2.3.3 感知机学习算法的对偶形式 实践&#xff1a;二分类模型&#xff08;iris数据集&#xff09;数…

【机器学习300问】17、什么是欠拟合和过拟合?怎么解决欠拟合与过拟合?

一个问题出现了&#xff0c;我们首先要描述这个问题&#xff0c;然后分析问题出现的原因&#xff0c;找到原因后提出解决方案。废话不多说&#xff0c;直接上定义&#xff0c;然后通过回归和分类任务的例子来做解释。 一、什么是欠拟合和过拟合&#xff1f; &#xff08;1&am…

微信小程序之全局配置-window和tabBar

学习的最大理由是想摆脱平庸&#xff0c;早一天就多一份人生的精彩&#xff1b;迟一天就多一天平庸的困扰。各位小伙伴&#xff0c;如果您&#xff1a; 想系统/深入学习某技术知识点… 一个人摸索学习很难坚持&#xff0c;想组团高效学习… 想写博客但无从下手&#xff0c;急需…

日常修复msvcp140.dll丢失的解决方法,msvcp140.dll文件的影响

msvcp140.dll文件是Microsoft Visual C Redistributable包的一部分&#xff0c;它在Windows系统中发挥着重要作用。当出现msvcp140.dll丢失的情况时&#xff0c;这意味着操作系统或应用程序无法找到该文件&#xff0c;可能会导致应用程序无法启动、错误提示等问题。幸运的是&am…

【漏洞复现】Atlassian Confluence远程代码执行漏洞(CVE-2023-22527)

文章目录 前言声明一、Atlassian Confluence简介二、漏洞描述三、影响版本四、漏洞复现五、整改意见 前言 Atlassian Confluence是澳大利亚Atlassian公司的一套专业的企业知识管理与协同软件&#xff0c;也可以用于构建企业WiKi。 声明 请勿利用文章内的相关技术从事非法测试…

knife4j调用接口报404

问题 Knife4j文档请求异常&#xff0c;请求资源的接口都是404 解决方法 就是请求路径出错了&#xff0c;我一开始还以为是拦截器拦截了来自knife4j发来的请求。。。

C++后端开发之Sylar学习一:配置环境

Sylar学习一&#xff1a;配置环境 安装虚拟机 我安装的是Ubuntu 20.04&#xff0c;分配了60G的SSD容量&#xff0c;8G的内存 配置Ubuntu 修改软件源 切换到管理员账户进入到/etc/apt目录 /etc/apt 目录是 Ubuntu 系统中存储与包管理系统 APT (Advanced Package Tool) 相关…

需求分析的结构化和面向对象方法

需求分析的方法&#xff0c;主要有结构化&#xff08;SA&#xff09;方法、面向对象分析&#xff08;OOA&#xff09;方法。另外有面向问题域的分析(Problem Domain Oriented Analysis&#xff0c;PDOA)方法&#xff0c;还有一些形式化方法例如VDM ( Vienna Design Method)和Z等…

Linux中Iptables使用

概念&#xff1a;网络中的防火墙&#xff0c;是一种将内部网络和外部网络分开的方法&#xff0c;是一种隔离技术 作用&#xff1a; 防火墙在内网与外网通信时进行访问控制&#xff0c;依据所设置的规则对数据包作出判断&#xff0c;最大限度地阻止网络中的黑客破坏企业网络&…

抓包工具Charles修改Response步骤

前言 Charles是在Mac下常用的截取网络封包的工具&#xff0c;在测试服务器端的网络通讯&#xff0c;往往用它来截取网络封包来分析。Charles通过将自己设置成系统的网络访问代理服务器&#xff0c;使得所有的网络访问请求都通过它来完成&#xff0c;从而实现了网络封包的截取与…

hcip高级网络知识

一&#xff1a;计算机间信息传递原理 抽象语言----编码 编码---二进制 二进制---转换为电流&#xff08;数字信号&#xff09; 处理和传递数字信号 二&#xff1a;OSI--七层参考模型 ISO--1979 规定计算机系统互联的组织&#xff1a; OSI/RM ---- 开放式系统互联参考模型 --- 1…

Spring扩展点在微服务应用(待完善)

ApplicationListener扩展 nacos注册服务&#xff0c; 监听容器发布事件 # 容器发布事件 AbstractAutoServiceRegistration#onApplicationEvent # 接收事件吗&#xff0c;注册服务到nacos NacosServiceRegistry#register Lifecycle扩展 #订阅服务实例更改的事件 NamingService#…

Spring基于AbstractRoutingDataSource实现MySQL多数据源

目录 多数据源实现 yml配置文件 配置类 业务代码 案例演示 多数据源实现 yml配置文件 spring:datasource:type: com.alibaba.druid.pool.DruidDataSourcedatasource1:url: jdbc:mysql://127.0.0.1:3306/datasource1?serverTimezoneUTC&useUnicodetrue&characte…

数据结构笔记1

来自《Python数据结构学习笔记》&#xff08;张清云 编著&#xff09; 第一章 数据结构基础 1.逻辑结构 集合&#xff1a;结构中的数据元素除了同属于一种类型外&#xff0c;别无其他关系线性结构&#xff1a;数据元素之间一对一的关系树形结构&#xff1a;数据元素之间一对…

SwiftUI 打造酷炫流光边框 + 微光滑动闪烁的 3D 透视滚动卡片墙

功能需求 有时候我们希望自己的 App 能向用户展示与众不同、富有创造力的酷炫视觉效果: 如上图所示,我们制作了一款流光边框 + 微光滑动闪烁的 3D 透视卡片滚动效果。这是怎么做到的呢? 在本篇博文中,您将学到以下内容 功能需求1. 3D 透视滚动2. 灵动边框流光效果3. 背景…

C++力扣题目56--合并区间 738--单调递增的数字 968--监控二叉树

56. 合并区间 力扣题目链接(opens new window) 给出一个区间的集合&#xff0c;请合并所有重叠的区间。 示例 1: 输入: intervals [[1,3],[2,6],[8,10],[15,18]]输出: [[1,6],[8,10],[15,18]]解释: 区间 [1,3] 和 [2,6] 重叠, 将它们合并为 [1,6]. 示例 2: 输入: interv…

关于一个QT程序的简单破解思路(不需要分析信号和槽的方法,通用所有程序的破解思路)

几年前,公司买了台国产贴片机,里面的主程序是QT编写,运行在WINDOW XP系统上。主程序打开的界面,如图: 我来简单介绍下程序界面,各位读者不需要搞明白功能,只要知道大体的流程即可。 分析主界面: 一、左边的列表&#xff1a; 贴片生产文件,里面包括了贴片时元器件的坐标、飞达…

【Flutter 面试题】Flutter 是什么?它与其他移动开发框架有什么不同?

文章目录 写在前面Flutter是什么&#xff1f;定义和起源核心设计思想架构组成总结 Flutter与其他移动开发框架的差异1. 跨平台性能2. Dart语言的全面优势3. 热重载功能的优化体验4. 丰富的组件和库的生态系统5. UI一致性和用户体验总结 写在前面 &#x1f44f;&#x1f3fb; 正…

瓦片地图编辑器——实现卡马克卷轴的编辑,键盘控制游戏移动和鼠标点击游戏编辑通过同一个视口实现。

左边是游戏地图编辑区&#xff0c;右边是地图缓冲区&#xff0c;解决了地图缓冲区拖动bug&#xff0c;成功使得缓冲区可以更新。 AWSD进行移动 鼠标左右键分别是绘制/拖动 按F1健导出为mapv3.txt F2清空数组 打印的是游戏数组 easyx开发devcpp 5.11 easyx20220922版本 #…