C++中的namespace(using namespace)的详细理解

2023-11-02

在C++语言编写的程序中,变量和函数等的作用范围是有一定限制的。比如,在函数体中定义的一个临时变量就不可以在函数体外使用。为了解决变量和函数等的作用范围,在C++语言中引入了名空间的概念,并增加了关键字namespace和using

在一个名空间中可以定义一组变量和函数,这些变量和函数的作用范围一致,可以将这些变量和函数称为这个名空间的成员。

通过名空间,可以在同一个文件中使用相同的变量名或函数名,只要它们属于不同的名空间。另外,名空间可以使得代码操作具有相同名字但属于不同库的变量。而且,名空间也可以提高C语言与C++语言的兼容性。

下面通过例程说明关键字namespace的用法。
#include <conio.h>
#include <iostream.h>
namespace car // 名空间的定义
{
  int model;
  int length;
  int width;
}

namespace plane
{
  int model;
  namespace size // 名空间的嵌套
  {
    int length;
    int width;
  }
}

namespace car // 添加名空间的成员
{
  char * name;
}

namespace c=car; // 定义名空间的别名
int Time; // 外部变量属于全局名空间

void main()
{
  car::length=3;
  // 下面一句错误,故屏蔽掉
  // width=2; // 对于非全局变量和当前有效临时变量应该指定名空间
  plane::size::length=70;
  cout<<"the length of plane is "<<plane::size::length<<"m."<<endl;
  cout<<"the length of car is "<<car::length<<"m."<<endl;
  // 使用名空间的别名
  cout<<"the length of c is "<<c::length<<"m."<<endl;
  int Time=1996; // 临时变量,应区别于全局变量
  ::Time=1997;
  cout<<"Temp Time is "<<Time<<endl;
  cout<<"Outer Time is "<<::Time<<endl;
  // 使用关键字using
  using namespace plane;
  model=202;
  size::length=93;
  cout<<model<<endl;
  cout<<size::length<<endl;
  getch();
}

运行结果:
the length of plane is 70m.
the length of car is 3m.
the length of c is 3m.
Temp Time is 1996
Outer Time is 1997

说明:
&#8226; 从上面可以看出,名空间定义了一组变量和函数,它们具有相同的作用范围。对于不同的
  名空间,可以定义相同的变量名或函数名,在使用的时候,只要在变量名或函数名前区分
  开不同的名空间就可以了。
&#8226; 名空间可以被嵌套定义,使用时要逐级对成员用名空间限定符: :来引用。
&#8226; 系统默认有一个全局名空间,它包含了所有的外部变量。这个名空间没有名字,引用这个
  名空间里的变量时要使用名空间限定符: :,前面没有名字。在不使用名空间的情况下,我
  们知道,不可以在不同文件中定义相同名字的外部变量,这是因为它们属于同一个全局名
  空间,名字不可以重复。
&#8226; 可以给名空间取一个别名。一般别名是一个比较短的名字,来简化编程。
&#8226; 在原有定义好的名空间的基础上,随时可以往里增加成员。

<<using>>
在前面的例程中可以看到,为了使用时的方便,又引入了关键字using。利用using声明可以在引用名空间成员时不必使用名空间限定符::。此外,关键字namespace和using的使用,对函数重载有一定的影响。

下面通过例程进行具体说明。
#include <conio.h>
#include <iostream.h>
namespace car // 名空间的定义
{
  void ShowLength(double len) // 参数类型为d o u b l e
  {
    cout<<"in car namespace: "<<len<<endl;
  }
}

namespace plane // 名空间的定义
{
  void ShowLength(int len) // 参数类型为i n t
  { 
    cout<<"in plane namespace: "<<len<<endl;
  }
}

void main()
{
  using namespace car;
  ShowLength(3);
  ShowLength(3.8);
  using namespace plane;
  ShowLength(93);
  ShowLength(93.75);
  getch();
}

运行结果:
in car namespace: 3
in car namespace: 3.8
in plane namespace: 93
in car namespace: 93.75

说明:
    如果没有名空间的干扰,函数重载时选择规则将是非常简单。只要实参是double类型,则调用的是前面的函数;如果实参是int类型,则调用后面的函数。但是由于名空间的参与,就出现了上面的运行结果。所以在编程的时候一定要注意名空间对函数重载的影响。


    应注意:调用函数时,如果实参和形参的数据类型实在没有办法完全匹配,可能会对实参进行适当的数据类型转换。比如,将char类型转换为int类型,或进一步将int类型转换为double类型。这种是将数据类型从简单往复杂转换,一般不会丢失信息。另外一种转换是反过来,将double类型转换为int类型,或进一步将int类型转换为char类型。这种是将数据类型从复杂往简单转换,可能会丢失部分信息。在调用函数的时候,不同的情况下,C++对上述两种转换的优先级是不同的。当引入了名空间后,则参与了上述优先级顺序的分配。

using namespace std之后,就省去了std::,可以直接引用std空间里面的函数和变量。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C++中的namespace(using namespace)的详细理解 的相关文章

  • GAMES101课程学习笔记—Lec 10~12:Geometry 几何、隐式与显式、曲线与曲面、网格

    1 几何的表达方式 几何表达分为显式和隐式 1 1 隐式几何 举个例子 用空间中一个点来表示面 隐式的几何不会告诉我们这些点在哪里 而会告诉我们这些点满足的函数关系隐式的表达很难直接看出它的形状是什么 但是判断点的位置关系 在内在外在表面
  • PyQt主窗口、对话框

    PyQt的各类窗口 一 主窗口 QMainWindow 1 窗口样式 2 窗口模态 二 对话窗口 QDialog 1 消息窗口 QMessageBox 2 输入窗口 QInputDialog 3 字体窗口 QFontDialog 4 文件窗
  • python编程题题库及答案

    1 Python编程题怎么写 2 python编程问题 3 Python编程题求助 Python编程题怎么写 1 根据题意 头的总数为35 用变量head来记录头的总数 head 35 而腿的总数为94 用变量foot来记录腿的总数 foo
  • 前端开发者快速入门安卓开发(安卓嵌入式开发课程经验总结)

    目录 1 安卓开发结构 2 xml 3 java 使用xml的标签 Bitmap 4 开发注意 1 安卓开发结构 安卓开发和前端有异曲同工之处 只是js换成了Java 它的界面层是xml格式的 布局全部放在layout下 2 xml 以la
  • 数据库课程设计------书店管理系统1后续

    数据库课程设计 书店管理系统 部分的展示图如下 具体请查看网址 https kisaaki github io 2021 12 11 E6 95 B0 E6 8D AE E5 BA 93 E8 AF BE E7 A8 8B E8 AE BE
  • NTC——热敏电阻的采集方法

    前言 最近在调试STM32ADC采集NTC热敏电阻的温度值 总结下NTC热敏电阻温度值的采集方法 硬件平台 STM32F205 软件平台 keil V5 函数库 标准库 NTC热敏电阻温度采集方法 热敏电阻的相关知识点见百度文库的介绍 传送
  • freetype描边和半透明实现

    可以参考官网的另外一个c 实现的版本 https www freetype org freetype2 docs tutorial example2 cpp 我把它转化为C代码如下 include
  • maven依赖找不到的解决:手动下载、多镜像导入。

    maven中央仓库 远在国外 没下载 因为网络原因迟迟下载不下来 所以我们就需要配置一些国内的镜像仓库 来进行jar包的下载 但是阿里的仓库并没有收录中央仓库的全部jar包 因此导致我们有些jar包下载不下来 爆红 整合网络上资料 可以考虑
  • Python入门基础知识总结

    目录 一 简介 二 Python基础语法 2 1 字面量 2 2 注释 2 3 数据类型转换 2 4 标识符 2 5 运算符 2 6 字符串 2 6 1 字符串的三种定义方式 2 6 2 字符串拼接 2 6 3 字符串格式化 2 6 4 格
  • 深度学习中Batch、Epoch、Iteration的理解

    Batch 每一次训练就是一次Batch Batch Size的大小表示一个Batch样本容量的大小 对于Batch Size的选择有多种策略 Batch Size越大 由于可以利用并行化的优势 处理速度就会越快 可以充分利用内存资源 但是
  • 基于 Mask R-CNN 的鸟类识别 app

    一个基于 Mask R CNN 的鸟类识别 APP 可以识别五种鸟类 mAP 83 前言 这是博主的毕设的课题 时间紧迫加上自身能力所限 最后的作品还有很多不足 还望各位不吝指正 代码已经上传到了 github 并附上了详细的使用说明 先放
  • 数据信息查询

    package com myjdbc import java sql Connection import java sql ResultSet import java sql SQLException import java sql Pre
  • TiDB 架构的演进和开发哲学

    本文来自 CSDN 程序员 2017 年 2 月的封面报道 对于一个从零开始的数据库来说 选择什么语言 整体架构怎么做 要不要开源 如何去测试 太多的问题需要去考量 在本篇文章中 PingCAP 联合创始人兼 CTO 黄东旭对 TiDB 的
  • 最小二乘的矩阵形式

    为m n的矩阵 b为m 1的矩阵 则Ax b表达了一个线性方程组 它的normal equation的形式为ATAx ATb 当Ax b有解时 即矩阵 A b 的秩与A的秩相同 Ax b与ATAx ATb的解集是一样 而当Ax b无解时 A

随机推荐

  • AT32F415 MSC IAP SpiFlash As Disk

    SC0097 AT32F415 MSC IAP SpiFlash As Disk 示例目的 提供USB外挂SPI FLASH模拟U盘 在通过U盘存储固件进行升级 注 本示例代码是基于雅特力提供的V2 x x板级支持包 BSP 而开发 对于其
  • HDU - 2100 Lovekey

    XYZ 26进制数是一个每位都是大写字母的数字 A B C X Y Z 分别依次代表一个0 25 的数字 一个 n 位的26进制数转化成是10进制的规则如下 A0A1A2A3 An 1 的每一位代表的数字为a0a1a2a3 an 1 则该X
  • 达梦数据库sql实现查询当天的数据

    1 库数据 2 sql语句 select
  • 推荐一款优秀电商开源项目

    简介 本文给大家推荐博主自己开源的电商项目newbee mall pro 在newbee mall项目的基础上搭建而来 使用 mybatis plus 作为 orm 层框架 并添加了一系列高级功能以及代码优化 特性如下 商城首页 为你推荐
  • C语言中的typeof关键字

    typeof关键字是C语言中的一种新扩展 返回变量的类型 从本质上讲 它更像是使用typedef定义一个类型名称 typeof的参数可以是两种形式 表达式或类型 1 下面是使用表达式的的例子 typeof x 0 1 这里假设x是一个函数指
  • 制作Android程序的应用图标并应用

    方案一 1 首先在网址 http romannurik github io AndroidAssetStudio icons launcher html 下载自己喜欢的图标 包含不同尺寸的图片 2 然后将下载的压缩包解压 并将里面的res文
  • 在Android里显示网页的多种方式

    在Android中显示网页主要有两种方式 一种是在Activity里面直接显示网页 另一种是调用浏览器显示网页 方式不同 使用的方法也不同 下面我们分别讲解 一 在Activity里面直接显示网页 1 在Manifest xml文件里添加I
  • android 功能模块之通讯模块五

    Android通讯录开发之获取运营商号码段 移动 联通 电信 2014年1月8日 开发记录 碎碎念 2014年的第一篇博客 原本是想写一篇随笔来开头 只因自己太懒把这件事忘记了 或者根本就不想写 我当实习生也当了接近半年了 工作上的内容和学
  • LLM总结(持续更新中)

    最新的参见LLM Summary 引言 当前LLM模型火出天际 但是做事还是需要脚踏实地 此文只是日常学习LLM 顺手整理所得 本篇博文更多侧重对话 问答类LLM上 其他方向 代码生成 这里暂不涉及 可以去看综述来了解 之前LLM模型梳理
  • 正态分布与均匀分布之间的变换

    一 任何分布都能化为 0 1 0 1 0 1 均匀分布 假设 F X a p x a F X a p x le a FX a p x a 为累积分布函数 f x f x f x 为概率密度函数 F X a a f x d x F X a i
  • stm32 IAP引导两个APP出现的问题及解决方法

    最近在做bootloader引导app时发现如果APP有操作系统时 会引导不起来 现象如下 平台 stm32H743 采用stm32cubemx配置的HAL库 测试方式 上电后运行boot loader bootloader是裸机运行 由b
  • cmake使用笔记

    vim CMakeLists txt mkdir build cd build cmake 创建 CMakeLists txt 添加内容 cmake minimum required VERSION 3 26 工程名称 project he
  • OSI、TCP/IP模型及协议

    文章目录 OSI模型 TCP IP模型 TCP协议 TCP报文 首部字段 数据字段 三次握手 三次握手时c s的状态 四次挥手 UDP协议 HTTP协议 HTTP 协议下的消息类型 Cookie Session HTTPS 常见web攻击技
  • SpringBoot配置默认Json解析工具以及空值处理方式

    SerializeConfig config new SerializeConfig 设置序列化为下划线 config propertyNamingStrategy PropertyNamingStrategy SnakeCase Stri
  • Android UI架构(十三)--App请求切换帧率(4)之SurfaceFlinger切换帧率.md

    文章目录 参考资料 简述 一 SurfaceFlinger接受帧率变化 1 1 SurfaceFlinger setDesiredActiveConfig 1 2 SurfaceFlinger repaintEverythingForHWC
  • 用C语言编写简化版银行系统:ATM取款机

    1 问题描述 用c语言编写一个简化的银行自动存款系统 适合刚接触C语言 尝试编写100多行代码的初学者作为参考 该代码编写围绕着银行ATM机器的4个业务 分别是查询 取款 存款 修改密码 其中需要两个文件 一个为DrawMoney txt文
  • 阿里巴巴开源限流系统 Sentinel 全解析

    今年下半年阿里开源了自研的限流系统 Sentinel 官方对 Sentinel 的介绍中用到了一系列高大山的名词诸如 限流 熔断降级 流量塑形 系统负载保护等 还有漂亮的形容词诸如 轻巧 专业 实时等 作为技术消费者看到这样的广告词之后禁不
  • 掌握GDB调试工具,轻松排除bug!

    一 什么是GDB gdb是GNU debugger的缩写 是编程调试工具 GDB官网 https www gnu org software gdb GDB适用的编程语言 Ada C C objective c Pascal 等 GDB的工作
  • Python-第三方库requests详解

    Requests 是用Python语言编写 基于 urllib 采用 Apache2 Licensed 开源协议的 HTTP 库 它比 urllib 更加方便 可以节约我们大量的工作 完全满足 HTTP 测试需求 Requests 的哲学是
  • C++中的namespace(using namespace)的详细理解

    在C 语言编写的程序中 变量和函数等的作用范围是有一定限制的 比如 在函数体中定义的一个临时变量就不可以在函数体外使用 为了解决变量和函数等的作用范围 在C 语言中引入了名空间的概念 并增加了关键字namespace和using 在一个名空