C++的对C的扩展

  • 1、::作用域运算符
  • 2、命名空间 namespace 解决命名冲突
    • 2.1 namespace命名空间的定义
    • 2.2 命名空间只能在全局范围内定义(**以下写法错误**)
    • 2.3 命名空间可以嵌套命名空间
    • 2.4 命名空间时开放的,即可以随时把新的成员加入已有的命名空间中(常用)
    • 2.5 命名空间可以存放变量和函数
    • 2.6 命名空间中的函数 可以在“命名空间”外定义
    • 2.7 无名命名空间,意味着命名空间中的标识符只能在本文件内访问,相当于这个标识符加上了static,使得其可以作为内部连接(了解)
    • 2.8 给命名空间取个别名(了解)
  • 3、using使用命名空间
    • 3.1 简化了从命名空间的成员访问
    • 3.2 using使用整个命名空间
    • 3.4 using指明使用具体的命名空间成员。(了解)
    • 3.5 using声明碰到函数重载(了解)
    • 3.6 不同命名空间中的同名成员使用的时候注意二义性

1、::作用域运算符

#include <iostream>using namespace std;
int a = 10;
void test01(){int a = 20;cout << "局部变量a=" << a << endl;cout << "全局变量a=" << ::a << endl;
}
int main(int argc, char *argv[])
{test01();return 0;
}

2、命名空间 namespace 解决命名冲突

2.1 namespace命名空间的定义

namespace A {int a = 10;
}
namespace B {int a = 20;
}void test02(){cout << "A中a=" << A::a << endl;cout << "B中a=" << B::a << endl;
}
int main(int argc, char *argv[])
{test02();return 0;
}

2.2 命名空间只能在全局范围内定义(以下写法错误

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

2.3 命名空间可以嵌套命名空间

namespace A {int a = 10;namespace C {int a = 10;}
}
void test03(){cout << "A中a=" << A::a << endl;cout << "C中a=" << A::C::a << endl;
}
int main(int argc, char *argv[])
{test03();return 0;
}

2.4 命名空间时开放的,即可以随时把新的成员加入已有的命名空间中(常用)

namespace A {int a = 10;namespace C {int a = 20;}
}
//将c添加到命名空间A中
namespace A {int b = 10;
}

2.5 命名空间可以存放变量和函数

namespace A {int a = 10;namespace C {int a = 20;}void func(){cout << "命名函数中存放函数"<<endl;}
}
void test03(){cout << "A中a=" << A::a << endl;A::func();
}int main(int argc, char *argv[])
{test03();return 0;
}

2.6 命名空间中的函数 可以在“命名空间”外定义

namespace A {int a = 10;namespace C {int a = 20;}void func();
}
//访问命名空间的数据不用加作用域
void A::func(){cout << "a=" << a << endl;
}
void test04(){A::func();
}int main(int argc, char *argv[])
{test04();return 0;
}

2.7 无名命名空间,意味着命名空间中的标识符只能在本文件内访问,相当于这个标识符加上了static,使得其可以作为内部连接(了解)

2.8 给命名空间取个别名(了解)

namespace veryLongName {int a = 10;namespace C {int a = 20;}void func(){cout << "a=" << a << endl;
}
}
void test(){namespace shortName = veryLongName;cout << "veryLongName :: a" <<  shortName::a << endl;//起别名之后,原名称与别名皆可使用shortName::func();veryLongName::func();
}

3、using使用命名空间

3.1 简化了从命名空间的成员访问

namespace A {int a = 10;namespace C {int a = 20;}void func();
}
void test05(){//使用A命名空间using namespace A;//使用的变量首先从命名空间中找,找不到的话,再从其他地方找。cout << "a=" << a << endl;
}int main(int argc, char *argv[])
{test05();return 0;
}

3.2 using使用整个命名空间

namespace veryLongName {int a = 10;namespace C {int a = 20;}void func(){cout << "命名空间中存放函数"<<endl;}
}void test07(){int a = 15;using namespace veryLongName;cout << a << endl;//访问的是局部变量中的acout << veryLongName::a << endl;//访问的是veryLongName中的a
}
int main(int argc, char *argv[])
{test07();return 0;
}

using使用整个命名空间会和全局变量冲突

3.4 using指明使用具体的命名空间成员。(了解)

using直接使用命名空间中的成员会和局部变量冲突

using直接使用命名空间中的成员会和局部变量冲突

int a = 15;
namespace veryLongName {int a = 10;namespace C {int a = 20;}void func(){cout << "命名空间中存放函数"<<endl;}
}void test08(){using veryLongName :: a;cout << a << endl;//cout << veryLongName::a << endl;//访问的是veryLongName中的a
}
int main(int argc, char *argv[])
{test08();return 0;
}

3.5 using声明碰到函数重载(了解)

namespace A {void func(){cout << "无参的函数" <<endl;}void func(int a){cout << "只有一个参数的函数" <<endl;}void func(int a,int b){cout << "有两个参数的函数"<<endl;}
}
void test09(){//using指明会对所有的func起作用using A::func;func();func(10);func(10,15);}
int main(int argc, char *argv[])
{test09();return 0;
}

3.6 不同命名空间中的同名成员使用的时候注意二义性


总结:

  1. 命名空间的含义(不能在函数内定义命名空间)
  2. 使用命名空间的成员最安全的方式 命名空房名::成员名
  3. using namespace 命名空间名;(使用整个命名空间)
 using namespace A;
  1. 单独使用命名空间中的具体成员:using 命名空间名::成员名;
using A::a;

C++的对C的扩展(1)相关推荐

  1. VS Code 安装 Go 插件、自定义扩展配置、断点调试

    1. 安装插件 使用快捷键 Ctrl+Shift+X 打开插件安装页面,安装 Go 插件. 2. 自定义扩展配置 使用快捷键 Ctrl+, 打开自定义配置页,编辑 settings.json ,定义与 ...

  2. VS Code 安装插件、自定义模板、自定义配置参数、自定义主题、配置参数说明、常用的扩展插件

    1. 下载和官网教程 下载地址:https://code.visualstudio.com/ 官方教程:https://code.visualstudio.com/docs 2. 安装插件 安装扩展插 ...

  3. gcc 自动识别的文件扩展名,gcc/g++ -x 选项指定语言,不同 gcc 版本 -std 编译选项支持列表

    对于执行 C 或者 C++ 程序,需要借助 gcc(g++)指令来调用 GCC 编译器. 对于以 .c 为扩展名的文件,GCC 会自动将其视为 C 源代码文件 对于以 .cpp 为扩展名的文件,GCC ...

  4. 用动态实现扩展TVM

    用动态实现扩展TVM Extending TVM with Dynamic Execution Outline ● Motivation for Dynamism ● Representing Dyn ...

  5. TVM apps extension示例扩展库

    TVM apps extension示例扩展库 此文件夹包含TVM的示例扩展库.演示了其它库如何在C++和Python API中扩展TVM. 该库扩展了TVM的功能. python模块加载新的共享库, ...

  6. Python 扩展 Op

    Python 扩展 Op 注意 :本文涉及的 Python Kernel 仅在 gcc 4.8.5 编译环境下充分测试,进一步的完善计划见 Issue 3951. 背景介绍 OneFlow 将各种对于 ...

  7. TensorFlow常用Python扩展包

    TensorFlow常用Python扩展包 TensorFlow 能够实现大部分神经网络的功能.但是,这还是不够的.对于预处理任务.序列化甚至绘图任务,还需要更多的 Python 包. 下面列出了一些 ...

  8. 部署可扩展的目标检测管道:推理过程(下)

    部署可扩展的目标检测管道:推理过程(下) 融合 感兴趣的目标可以被遮挡.有时只能看到目标的一小部分(少至几个像素). • 图19.车辆和交通信号灯被遮挡. • 图20:阻塞了总线. • 图21:左侧的 ...

  9. 部署可扩展的目标检测管道:推理过程(上)

    部署可扩展的目标检测管道:推理过程(上) 基于YOLOv3的目标检测推理过程的所有代码都可以在eriklindernoren/PyTorch-YOLOv3 GitHub repo找到. 为了进行审查, ...

  10. 扩展LLVM:添加指令、内部函数、类型等

    扩展LLVM:添加指令.内部函数.类型等 Introduction and Warning Adding a new intrinsic function Adding a new instructi ...

最新文章

  1. NetBeans使用介绍(五)
  2. Redis与Memcached简要比较
  3. 前端临床手扎——简单易用的fetch
  4. OpenCV 礼帽和黑帽
  5. (转,改)UML中的几种关系
  6. 和吴昊一起玩推理 Round 2 —— 蚂蚁爬杆问题
  7. Python的元组被设计成不可变的影响
  8. C语言关键字以及-格式输入输出中“%d,%o,%x,%e,%f”等的含义
  9. Docker-compose 常用命令
  10. 敏捷宣言 敏捷原则_学校可以敏捷吗?
  11. pythonfor循环break_Python break语句 跳出循环
  12. 虚拟主机如何创建svn服务器,虚拟主机搭建svn
  13. 解读2015之大数据篇:大数据的黄金时代
  14. javaScript的内置对象JSON
  15. zpf框架的business使用方法
  16. tkintergui-pack布局内容1
  17. FPGA初学者__个人学习笔记(二)_ generate 用法
  18. Hubstudio指纹浏览器和YiLu代理(易路代理)的配置教程
  19. 论文笔记:Delving into Data: Effectively Substitute Training for Black-box Attack
  20. 大规模机器集群-单机/集群/服务/机房/从零恢复的快速交付

热门文章

  1. HDU4466 Triangle 计数 容斥原理
  2. php框架 s,开源免费的PHP框架|轻量级PHP框架(DecSoft's Humm PHP)下载 V2019.4 官方版 - 比克尔下载...
  3. Laravel框架简介
  4. Google Earth Engine(GEE)——Landsat卫星影像重采样提高分辨率
  5. 马哥linux运维1~14讲笔记+自我知识储备补充
  6. C# iTextSharp 创建PDF水印
  7. 1999-2018年地级市环境污染及处理数据
  8. 【OpenCV技能树】——OpenCV基础
  9. C#winform+SqlServer 眼镜店管理系统
  10. Tomcat执行时报A fatal error has been detected by the Java Runtime Environment:SIGSEGV (0xb)