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

C++入门:命名空间

假设这样一种情况,当一个班上有两个名叫 Zara 的学生时,为了明确区分它们,我们在使用名字之外,不得不使用一些额外的信息,比如他们的家庭住址,或者他们父母的名字等等。

同样的情况也出现在 C++ 应用程序中。例如,您可能会写一个名为 xyz() 的函数,在另一个可用的库中也存在一个相同的函数 xyz()。这样,编译器就无法判断您所使用的是哪一个 xyz() 函数。

因此,引入了命名空间这个概念,专门用于解决上面的问题,它可作为附加信息来区分不同库中相同名称的函数、类、变量等。使用了命名空间即定义了上下文。本质上,命名空间就是定义了一个范围。

关于命名空间内变量和函数及全局变量的使用和作用域:

#include <iostream>
using namespace std;
namespace A
{int a = 100;namespace B            //嵌套一个命名空间B{int a =20;}
}int a = 200;//定义一个全局变量int main(int argc, char *argv[])
{cout <<"A::a ="<< A::a << endl;cout <<"A::B::a ="<<A::B::a << endl;cout <<"a ="<<a << endl;cout <<"::a ="<<::a << endl;int a = 30;cout <<"a ="<<a << endl;cout <<"::a ="<<::a << endl;return 0;
}

结果:

A::a =100  
A::B::a =20
a =200      //全局变量a
::a =200
a =30       //局部变量a
::a =200  

:全局变量 a 表达为 ::a,用于当有同名的局部变量时来区别两者。

补充关于 using 的错误事例:

#include <iostream>
using namespace std;
namespace A
{int a = 100;int fun(){cout<<"a = "<<a<<endl;}namespace B            //嵌套一个命名空间B{int a =20;int fun(){cout<<"a = "<<a<<endl;}}
}int main(int argc, char *argv[])
{cout<<a<<endl;fun();return 0;
}

这样会出错:会显示 a 变量和 fun 函数 “was not declared in this scope”,即找不到这个 a 和 fun 函数。

解决办法: 用 using 来告诉编译器用到的是哪个命名空间内的内容。在 main() 上面加 using namespace A; 或者 using namespace A::B; 。这样就可以使用其中的 a 和 fun()。但是不能同时使用,因为这样也会导致编译出错,编译器器不知道要去使用哪个 a 和 fun()。

补充一个命名空间冲突的情况:

#include <iostream>using namespace std;
namespace A {int a = 100;namespace B            //嵌套一个命名空间B{int a = 20;}
}int a = 200;//定义一个全局变量int main(int argc, char *argv[]) {cout << "A::a =" << A::a << endl;        //A::a =100cout << "A::B::a =" << A::B::a << endl;  //A::B::a =20cout << "a =" << a << endl;              //a =200cout << "::a =" << ::a << endl;          //::a =200using namespace A;cout << "a =" << a << endl;     // Reference to 'a' is ambiguous // 命名空间冲突,编译期错误cout << "::a =" << ::a << endl; //::a =200int a = 30;cout << "a =" << a << endl;     //a =30cout << "::a =" << ::a << endl; //::a =200//即:全局变量 a 表达为 ::a,用于当有同名的局部变量时来区别两者。using namespace A;cout << "a =" << a << endl;     // a =30  // 当有本地同名变量后,优先使用本地,冲突解除cout << "::a =" << ::a << endl; //::a =200return 0;
}
http://www.lryc.cn/news/20282.html

相关文章:

  • 操作系统(复试准备)
  • 2023年CDGA考试模拟题库(501-600)
  • NCNN+Int8+yolov5部署和量化
  • springboot+vue.js协同过滤算法之智能旅游推荐系统java
  • Google Brain新提出的优化器“Lion”,效果要比Adam(W)更好
  • 慢雾:Discord 私信钓鱼手法分析
  • 2023-2-25 刷题情况
  • 【数据结构】双向链表的接口实现(附图解和源码)
  • 数据结构与算法之[把数字翻译成字符串]动态规划
  • java 面向对象三大特性之多态 万字详解(超详细)
  • git push origin master 情况
  • ElasticSearch查询优化routing
  • 【HashMap 1.7和1.8】
  • 【Zabbix实战之故障处理篇】Zabbix监控中文乱码问题解决方法
  • 学习(mianshi)必备-ClickHouse高性能查询/写入和常见注意事项(五)
  • 在Kotlin中探索 Activity Results API 极简的解决方案
  • 样式冲突太多,记一次前端CSS升级
  • 如何解决报考PMP的那些问题?
  • 数据结构栈的经典OJ题【leetcode最小栈问题大剖析】【leetcode有效的括号问题大剖析】
  • 数据结构与算法之打家劫舍(一)动态规划思想
  • 无人驾驶路径规划论文简要
  • C++ sort()函数和priority_queue容器中比较函数的区别
  • STM32开发(14)----CubeMX配置ADC
  • Simple RNN、LSTM、GRU序列模型原理
  • 【原创】java+swing+mysql生肖星座查询系统设计与实现
  • CentOS 环境 OpneSIPS 3.1 版本安装及使用
  • SQL95 从 Products 表中检索所有的产品名称以及对应的销售总数
  • 平时技术积累很少,面试时又会问很多这个难题怎么破?别慌,没事看看这份Java面试指南,解决你的小烦恼!
  • SQL Server 数据库的备份
  • NCNN Conv量化详解1