首页 > 编程语言 >c++基本编程体验第3节之命名空间

c++基本编程体验第3节之命名空间

时间:2022-08-17 22:12:25浏览次数:62  
标签:函数 编程 namespace c++ 空间 匿名 体验 命名

3.1、何为命名空间

  3.1.1、命名空间的引入

  (1)命名空间namespace,是c++引入的一种解决全局变量和函数名冲突机制

  (2)c语言没有namespace,但是c++及之后的java python 等都有

  (3)namespace的关键点有2个:一是如何解决名称冲突,二是如何合法的访问变量

   3.1.2、c语言如何解决名称冲突

  (1)首先在大型的c语言项目中,全局变量和函数命名冲突在所难免。

  (2)c语言中的办法是:

    1.同一个c文件不要太大,且由同一个人编写。

    2.每个c文件中全局变量或者函数前加唯一前缀(比如 HAL库的sd卡模块统一加 HAL_SD_XXX)。

    3.不需要外文件访问的全局变量和函数前加static。

  3.1.3、命名空间如何解决问题

  (1)为实现命名空间机制,c++引入namespace关键字,定义格式为namespace xx{}。

  (2)一个特定的名称namespace的一对大括号内部定义的变量、函数、类等均属于该命名空间内。

  (3)在该命名内部互相引用是可以直接使用变量名、函数名等。

  (4)跨命名空间互相引用时必须同时指定被引用方的命名空间名和变量函数名才可以找到。

  (5)命名空间本质上其实是对全局变量和函数在一定范围内链接属性的更改和控制。

  3.1.4、关于语言

  (1)语言特性必定对应解决某种问题,必定在某方面对程序员有帮助。

  (2)语言特性是语言通过关键字或者符号所支持的一种功能特性,如:namespace、template、运算符重载、面向对象。

  (3)语言特性越多则语言本身就越难使用,但是语言就越厉害。

  (4)掌握一种本质就是掌握和熟练运用语言特性。

3.2、namespace的初级定义和使用

  3.2.1、同一文件定义namespace

    namespace name

    {

    };

  3.2.2、同一文件内使用namespace

      (1)命名空间的名称 :: 函数名                        //跨命名空间访问函数(变量亦可)

    (2)using 命名空间的名称 :: 函数名;             //声明该命名空间的函数(变量亦可)

                  函数名                                                        //编译是可以找到

    (3)using namespace 命名空间名;               //声明该命名空间,在使用时可以随意访问该命名空间内的函数和数据

    

  3.2.3、不同文件(比如 1.cpp 2.cpp)内使用namespace

    (1)猜测 using ns2::func3;   //实际编译会报错

    (2)    

    注意声明和定义的区别;

 

3.3、c++默认命名空间

   3.3.1、默认命名空间

    (1)又叫全局命名空间

    (2)默认命名空引用其他命名空间方法

    (3)默认命名空间引用自己的办法

    (4)其他命名空间引用默认命名空间中的办法::f()

 3.4、c++匿名命名空间

  3.4.1、std和cout的引入

    (1)std是c++标准库定义好的一个namespace

    (2)cout是std这个namespace下的一个标准工具,类似于c中的printf

    (3)用法

    3.4.1、匿名命名空间的定义和使用

    (1)定义

              namespace

    {

       void func(void)

      {

      }

    };    //func属于匿名命名空间

      (2)匿名命名空间中引用其他命名空间中的方法 -- 

    (3)匿名命名空间中引用自己命名空间的方法

    (4)其他命名空间中引用匿名命名空间中的方法-----跨文件是不可行的。

    3.4.1、匿名命名空间存在的价值和意义

        (1)匿名命名空间中的符号纯文件内部使用,不需要被外部引用。  

      (2)匿名命名空间效果类似于全局变量和函数加static,但是匿名命名空间的作用比c中的使用范围要广,比如:结构体类型也可以不让外部文件访问,但是c语言做不到。

    (3)匿名命名空间的用法逻辑上符合整个命名空间的一贯原则。

 3.5、嵌套的命名空间

       3.5.1、嵌套namespace的定义和使用

      (1)定义

    (2)外部引用嵌套命名空间内的符号

    (3)嵌套命名空间内部不同层次间符号的互相引用。

 

标签:函数,编程,namespace,c++,空间,匿名,体验,命名
From: https://www.cnblogs.com/947033916-fwh/p/16585696.html

相关文章

  • c++ 实现hashmap
    由于hashmap不是c++stl中标准实现,这样在跨平台使用时就可能会出现问题,于是想到自己实现一个hashmaphash算法使用开链法解决hash冲突,主要实现了添加,删除,查找几个方法头文......
  • C++primer练习14.26
    练习14.26为你的String类定义下标运算符char&operator[](size_td){returnelements[d];}constchar&operator[](size_td)const......
  • C#异步编程
    一直不是太懂,唉使用Async和Await的任务异步编程(TAP)模型(C#)|MicrosoftDocsC#彻底搞懂async/await-五维思考-博客园(cnblogs.com)C#之Async/Await-......
  • ENVI Modeler体验之构建工作流
    ENVIModeler系列文章ENVIModeler建模工具重磅发布 (介绍技术特点)ENVIModeler体验之构建工作流 (介绍建模方法)ENVIModeler体验之生成ENVI扩展工具 (介绍生成ENVI......
  • C/C++ 如何拷贝一个wchar_t类型的字符串
    1Dothis,23wchar_tclone[260];45wcscpy(clone,szPath);67Or,ifyouwanttoallocatememoryyourself,89wchar_t*clone=newwchar_t[wc......
  • C++ 起别名
    可以基于typedef、using等关键词实现typedef std::vector<int>intvec;using intvec =std::vector<int>; //这两个写法是等价的另一个例子,函数指针:typedefvoid(*......
  • 面向对象编程(深入)
    1/*2面向对象的三个概念31、类:是一个抽象概念,是产生对象的一个容器42、对象(实例):是一个实体,由类产生出来的一个带有类属性和方法的实体。53、实例化:产......
  • [Python学习笔记]Python基础-12 面向对象编程_属性和方法
    内置属性可以使用内置函数dir查看一个对象支持的所有属性和方法,Python中存在很多的内置属性classPerson(object):def__init__(self,name,age)->None:......
  • [Python学习笔记]Python基础-13 面向对象编程_继承和多态
    继承面向对象的编程有三大特性封装:函数是对语句的封装类是对函数和变量的封装继承类和类之间可以人为,手动的建立父子关系父类的属性和方法,子类可以使用......
  • 基于C++的OpenGL 13 之Mesh
    1.引言本文基于C++语言,描述OpenGL的Mesh前置知识可参考:基于C++的OpenGL12之多光源-当时明月在曾照彩云归-博客园(cnblogs.com)笔者这里不过多描述每个名词、......