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

C++第二篇:命名空间(namespace)

        在C语言中,定义变量的时候,全局变量名并不能相同,不然就会报错。但是在C++中,有了命名空间的存在,就可以避免这个问题。我们可以将它想像成一个班级,一班的李华和二班的李华名字都叫李华,但是一个是一班的,一个二班的,并不会混淆。所以命名空间的核心作用避免命名重复,使得代码模块化。

        在命名空间中,可以定义变量、函数、类和结构体等。来看下面的示例:

#include <iostream>
#include <string>
//定义命名空间SpaceA
namespace SpaceA {int num = 10;struct student{std::string name;int age;};
}
//定义命名空间SpaceB
namespace SpaceB {int num = 20;
}//using SpaceA::num;
//注意点:上面的注释的操作是将命名空间的变量引出,这样写法容易引发歧义,
//如果此时还有一个全局变量为num,编译器就不知道该
//指向哪个的num,从而引发歧义。//using namespace SpaceA;
//使用这样的写法,可以使用命名空间成员,无需在变量前面xxx::
//但这样的写法会有代码的冗余,同时这样的写法也会导致歧义;
//实际上用到哪个变量就在前面加上xxx::,更加规范。int main()
{   struct SpaceA::student stu;stu.age = 18;stu.name="lihua";//相同的变量名在不同的命名空间互不影响std::cout << SpaceA::num << std::endl;std::cout << SpaceB::num << std::endl;std::cout << stu.age << std::endl;std::cout << stu.name << std::endl;return 0;
}

结果如图:

 

可以看到,在这段代码中,有两个命名空间,具有相同的变量num,但并不影响,同时在命名空间中环定义了一个结构体。这说明了命名空间确实可以让代码的命名变得更加灵活。

需要记住的是:外部(其他文件.c.h)调用该命名空间时,变量是需要再声明时加上extern 关键词修饰,函数则不需要,因为函数是默认可以被调用的。

通过这段代码,相信大家命名空间有了一定的理解,那么还剩下::<<运算符我们再来了解一下:

  • ::实际上是用来访问成员的,比如上面代码中使用::来访问了SpaceA中的结构体中的一个变量。
SpaceA::num
  • << 实际上是一个运算符,作用是将数据插入到输出流,但在与int,float等数据结合,就还是左移运算符。

重点:再看上面的代码,实际上我们会发现,string这样的的一个类型,并且我们可以直接对变量进行字符串赋值。很出人意料!在C中,我们通常是使用strcpy()函数将一个字符串拷贝到一块地址,但C++却可以直接赋值。实际上,这里牵扯到了C和C++的一个区别,就是C++是面向对象的,而C是面向过程的。string 实际上就是一个对象,而对直接赋值字符串就是这个对象的特有的功能。至于什么是对象,后面会讲到。

http://www.dtcms.com/a/395871.html

相关文章:

  • vcsa 重启服务
  • QT 两种库写法 LIBS += .a和LIBS += -L -l
  • 比斯特自动化|电动自行车电池点焊机的作用与使用
  • Django 模型与 ORM 全解析(一):从基础到实战的完整指南
  • NW955NW960美光固态闪存NW963NW971
  • iOS 26 软件兼容性大检查,哪些 App 出问题、API 变动要注意、旧功能不支持兼容性测试全流程
  • HarmonyOS NEXT互动卡片开发:从原理到实战的完整指南
  • 邪修实战系列(6)
  • Clover: 1靶场渗透
  • 智慧供水管网监测解决方案:实现压力、流量、水质数据集与监控
  • 深入理解Java虚拟机内存模型
  • 什么是缺陷检测?机器视觉表面缺陷检测从定义到实战方法,避开漏判误判
  • Svelte:编译时优化原理、与传统虚拟DOM框架的性能对比性能优化
  • 属性描述符
  • JavaWeb之JSP 快递管理与过滤器详解
  • 《MedChat智能医疗问答系统》项目介绍
  • 使用FastAPI和Docker部署机器学习模型:从开发到生产的最佳实践
  • Per-Tensor 量化和Per-Channel 量化
  • 执行bat任务栏有图标显示,执行pycharm64.exe就没有是什么原因
  • 【Docker项目实战】使用Docker部署wealth-tracker个人资产分析工具
  • LeapMotion_Demo演示
  • 智慧图书管理|基于SprinBoot+vue的智慧图书管理系统(源码+数据库+文档)
  • 面试技巧第四篇:嵌入式通信机制考点:消息队列、信号量与互斥锁
  • 面试八股:C语言的预处理和类型定义
  • 强化学习1.3 深度学习交叉熵方法
  • 用PowerBI的思想解决QuickBI文本无法动态配色问题
  • 逆向解析 1688 商品详情接口:自主构建 Sign 签名算法实战
  • SpringCloud项目阶段六:feign服务降级处理以及基于DFA算法的自管理敏感词审核和tess4j图片文字识别集成
  • 跨行业安全合规文档协同平台:重塑制造企业的质量管理与合规运营新范式
  • 线性代数 · SVD | 奇异值分解命名来历与直观理解