C++入门:命名空间

news/2024/11/18 8:09:10/

目录

一.前言 

C++关键字(C++98)总览:

一.作用域

二.命名冲突

 三.命名空间

命名空间定义:

命名空间的嵌套定义:

四.命名空间的使用

五.命名空间的本质


一.前言 

C++是从C语言延伸出来的编程语言,C++兼容了C语言百分之九十九的语法和特性,同时对于C语言(尤其是面对规模较大的工程时)中许多设计不合理的地方进行了优化并容纳进去了面向对象编程思想,增加了许多有用的库,以及编程范式等。

C++关键字(C++98)总览:

C++总计63个关键字,C语言32个关键字

 

 

红色方框圈出了C++新引入的关键字 

一.作用域

程序中的作用域分为全局作用域和局部作用域

全局作用域中声明的标识符在所有作用域中都有效,而且具有跨编译单元(一个.cpp文件就是一个编译单元)的链接属性(即在整个项目工程中可见)。(不考虑static修饰的情况) 

二.命名冲突

当局部作用域和全局作用中有标识名重复定义时,遵循局部优先原则,这种情况可以理解为命名污染,此时程序不会报错。

当全局作用域中声明的标识符之间重复定义时,就会发生命名冲突,程序就会报错

面对巨大的项目工程,C语言没办法解决类似这样的命名冲突问题;

 三.命名空间

一个项目中,众多变量,函数,类以及结构类型的标识名如果重复出现就会发生冲突,而C语言对此并没有很好的解决方法(尤其是当工程项目特别大的时候),于是C++便引入了命名空间的语法,很好地避免了大工程中命名冲突或命名污染的问题

命名空间定义:

定义命名空间,需要使用到namespace关键字,后面跟命名空间的名字,然后接一对{}即可,{}中即为命名空间的成员

命名空间中可以定义变量/函数/类型;

 

namespace bit
{// 命名空间中可以定义变量/函数/类型int rand = 10;int Add(int left, int right){return left + right;}一个命名空间就定义了一个新的作用域,命名空间中的所有内容都局限于该命名空间中
}

 

命名空间不能定义在局部作用域中,其中不存在可执行代码;

命名空间可以嵌套定义;

命名空间的嵌套定义:

namespace N1
{int a;int b;int Add(int left, int right){return left + right;}namespace N2{int c;int d;int Sub(int left, int right){return left - right;}}
}

命名空间嵌套定义时,内层命名空间和外层命名空间即使存在相同的标识符,也不会发生命名冲突。

同一个工程中允许存在多个相同名称的命名空间,编译器在执行链接的阶段会将同名的命名空间合成同一个命名空间。命名空间本身的标识名不存在命名冲突的问题。

四.命名空间的使用

作用域限定符    ::

取消命名空间限制的关键字:using

一个命名空间就定义了一个新的作用域,命名空间中的所有内容都局限于该命名空间中

 

命名空间的使用有三种方式:

(1)在被访问的标识名前加命名空间名称及作用域限定符::

被嵌套命名空间中内容的访问

(2)使用using将命名空间中某个成员引入

(3) 使用using namespace+命名空间名称:解除相应命名空间对其中所有内容的作用域限制

第三种用法相当于是取消相应的命名空间,这种使用方式十分不推荐(尤其是在大项目中),推荐使用的访问命名空间内容的方法是第(1),第(2)种。

五.命名空间的本质

命名空间的本质作用是将全局作用域划分为多个独立的编译区块,各个编译区块在IDE执行链接时是互相不可见的,只有通过作用域限定符:: ,和using关键字才能使编译器执行链接时链接到相应命名空间中的内容.

通过这样语法规则,C++很好地避免了编程中可能出现的命名污染和命名冲突问题。

 


http://www.ppmy.cn/news/12828.html

相关文章

linux服务管理

1.service 用法:service 服务名 start/stop/restart 实例: 重启网络服务: #service network retart 关闭ftp服务: #service vsftpd stop 打开httpd服务 #service httpd start 2.chkconfig 功能:能够为不同的系统级别设…

nginx 伪静态 Rewrite 正则

正则表达式匹配 : ~ 为区分大小写匹配~* 为不区分大小写匹配!~ 和 !~*分别为区分大小写不匹配及不区分大小写不匹配 文件及目录匹配,其中: -f和!-f用来判断是否存在文件-d和!-d用来判断是否存在目录-e和!-e用来判断是否存在文件或目录-x和!-x…

第一层:封装

文章目录前言类和对象封装class权限publicprotectedprivatestruct和class的区别封装的好处封装的用法学完封装,突破第一层🎉welcome🎉 ✒️博主介绍:一名大一的智能制造专业学生,在学习C/C的路上会越走越远&#xff0c…

算法记录Day52|300.最长递增子序列、674. 最长连续递增序列、718. 最长重复子数组

一、300.最长递增子序列 1.题目描述: 给你一个整数数组 nums ,找到其中最长严格递增子序列的长度。 子序列是由数组派生而来的序列,删除(或不删除)数组中的元素而不改变其余元素的顺序。例如,[3,6,2,7] …

【AcWing周赛】AcWing第86场周赛

目录 <一>AcWing 4794. 健身 一、题目 1、原题链接 2、题目描述 二、解题报告 1、思路分析 2、时间复杂度 3、代码详解 <二>AcWing 4795. 安全区域 一、题目 1、原题链接 2、题目描述 二、解题报告 1、思路分析 2、时间复杂度 3、代码详解 <三…

Pandas 数据结构 - Series

前言Pandas Series 类似表格中的一个列&#xff08;column&#xff09;&#xff0c;类似于一维数组&#xff0c;可以保存任何数据类型。Series 由索引&#xff08;index&#xff09;和列组成&#xff0c;函数如下&#xff1a;pandas.Series( data, index, dtype, name, copy)参…

关于原子操作、自旋锁、信号量、互斥体的使用场景和注意事项

原子操作 相关函数 原子操作API typedef struct { int counter; } atomic_t;函数 描述 ATOMIC_INIT(int i) 定义原子变量的时候对其初始化。 int atomic_read(atomic_t *v) 读取 v 的值&#xff0c;并且返回。 void atomic_set(atomic_t *v, int …

Vue3+TypeScript系统学习(十五) - 详解Vue3 Composition API(二)

前面给大家分享了Options API语法中代码的复用、Options API编码的优缺点&#xff0c;以及setup函数&#xff0c;响应式API等&#xff0c;这次将给大家分享Vue3 Composition API中的计算属性&#xff0c;侦听器&#xff0c;生命周期函数&#xff0c;Provide和Inject等。 1.1 co…