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

C++:命名空间

    从今天正式开始对C++的学习,这里只学习C++对C的拓展,和C相同的部分在C语言专栏中都可以找到,我们先看一段C++代码

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

     同样也是打印hello world,头文件还有main函数之前的using namespace std什么意思,cout又是什么意思,都需要我们进行了解

1.命名空间基础

     当一个项目很大时,它可能会包含大量重复的名字,C++可以对名字的产生和其所在作用域进行控制,在之前C语言的学习我们可以通过static关键字来使得名字只能在本编译单元内可见,在C++中我们可以通过命名空间来控制对名字的访问

     在C++中,名称可以是符号常量、变量、宏、函数、结构体、枚举等等

     std是C++标准命名空间,C++标准程序库中的所有标识符都被定义在std命名空间中,比如类iostream、vector等,使用时要加上using声明(using namespace std)或using指示(如std::cout)。

     可以定义不同的命名空间,这样即使名字相同也不会出现错误,类似这样:

      那我们如何定义命名空间呢,下面就是了

 2.命名空间的使用

2.1 命名空间的定义

namespace 名称
{//定义变量、函数、类型等等}

2.2 命名空间成员的访问

   (1)使用作用域操作符 ::

   (2)空间名::成员

#include<iostream>
using namespace std;namespace nameA  //定义一个名字是nameA的空间
{int a;void func(){cout<<"nameA"<<endl;}
}namespace nameB   //定义一个名字是nameB的空间
{int a;void func(){cout<<"nameB"<<endl;}
}int main()
{//访问空间中的成员变量nameA::a=100;nameB::a=200;cout<<"A::a:"<<nameA::a<<endl;//cout就类似printf,用来输出内容,endl的作用就相当于\ncout<<"B::a:"<<nameB::a<<endl;//访问空间中的成员函数nameA::func();nameB::func();return 0;
}

        由此可见,在不同的命名空间中定义相同名字的变量或者函数都是没有问题的,两个空间相互独立,谁也不会影响谁,这就是C++的优势! 

2.3 命名空间的错误使用

      命名空间不能在某个函数内定义,比如这样:

void test()
{namespace A{int a=10;}namespace B{int a=10;}cout<<A::a<<endl;cout<<B::a<<endl;
}

     命名空间只能在全局范围内定义,否则你函数调用结束了,空间也没了,等于没定义,费这么大劲干嘛,只能在全局范围内定义!

2.4 命名空间的嵌套使用

namespace A
{int a=10;namespace B{int a=10;}
}
void test()
{cout<<A::a<<endl;cout<<A::B::a<<endl;
}

2.5 命名空间的别名

     如果命名空间的名字很长记不住怎么办,我们有办法,起个别名,代码如下:

namespace veryLongname
{int a=10;void func(){cout<<"hello world"<<endl;}void test()
{namespace shortname=veryLongname;//起别名cout<<"veryLongname::a:"<<shortname::a<<endl;veryLongname::func();shortname::func();
}

     可以看到,两个名字的效果是一样的,神奇不神奇?

相关文章:

  • input、el-input输入框输入规则
  • DevEco Studio 项目鸿蒙(HarmonyOS)资源引用(自定统和系统)
  • 【自定义Source、Sink】Flink自定义Source、Sink对ClickHouse进行读和批量写操作
  • 【模块化】 js 模块化(CommonJS, AMD, UMD, CMD, ES6)
  • linux系统命令
  • 基于OHTPPS实现网站HTTPS访问
  • 使用国内镜像源安装opencv
  • 计算机组成原理-选择语句和循环语句的汇编表示
  • 【数据结构】第二章——线性表(1)
  • linux(centos7)离线安装mysql-5.7.35-1.el7.x86_64.rpm-bundle.tar
  • 一文速览字节最新分布式操作系统KubeWharf
  • vue+react题集整理
  • 设计模式之结构型设计模式(二):工厂模式 抽象工厂模式 建造者模式
  • Oracle 数据库 control file的备份
  • TensortRT:sample.py:DeprecationWarning:
  • “大数据应用场景”之隔壁老王(连载四)
  • 【css3】浏览器内核及其兼容性
  • 03Go 类型总结
  • CentOS7 安装JDK
  • Docker 笔记(1):介绍、镜像、容器及其基本操作
  • js继承的实现方法
  • Mysql数据库的条件查询语句
  • Python学习之路16-使用API
  • Vue--数据传输
  • 服务器之间,相同帐号,实现免密钥登录
  • 解决jsp引用其他项目时出现的 cannot be resolved to a type错误
  • 使用 @font-face
  • 使用Envoy 作Sidecar Proxy的微服务模式-4.Prometheus的指标收集
  • 试着探索高并发下的系统架构面貌
  • 线性表及其算法(java实现)
  • 学习ES6 变量的解构赋值
  • 一起来学SpringBoot | 第三篇:SpringBoot日志配置
  • 原生Ajax
  • 《天龙八部3D》Unity技术方案揭秘
  • $GOPATH/go.mod exists but should not goland
  • %3cscript放入php,跟bWAPP学WEB安全(PHP代码)--XSS跨站脚本攻击
  • (09)Hive——CTE 公共表达式
  • (cos^2 X)的定积分,求积分 ∫sin^2(x) dx
  • (java版)排序算法----【冒泡,选择,插入,希尔,快速排序,归并排序,基数排序】超详细~~
  • (附源码)springboot工单管理系统 毕业设计 964158
  • (附源码)ssm码农论坛 毕业设计 231126
  • (解决办法)ASP.NET导出Excel,打开时提示“您尝试打开文件'XXX.xls'的格式与文件扩展名指定文件不一致
  • (三)docker:Dockerfile构建容器运行jar包
  • (四)搭建容器云管理平台笔记—安装ETCD(不使用证书)
  • (原創) 是否该学PetShop将Model和BLL分开? (.NET) (N-Tier) (PetShop) (OO)
  • (转)Scala的“=”符号简介
  • (状压dp)uva 10817 Headmaster's Headache
  • .Net Core webapi RestFul 统一接口数据返回格式
  • .NET Core 控制台程序读 appsettings.json 、注依赖、配日志、设 IOptions
  • .net开发时的诡异问题,button的onclick事件无效
  • .net快速开发框架源码分享
  • .NET连接MongoDB数据库实例教程
  • /bin/bash^M: bad interpreter: No such file or directory
  • @SentinelResource详解
  • [ vulhub漏洞复现篇 ] Django SQL注入漏洞复现 CVE-2021-35042