命名空间的引入
C语言的缺陷以及C++的解决。
看下面这个代码:
这里进行了报错。
这里包含rand所在的头文件,然后头文件会进行展开。然后头文件里的rand和全局变量rand就会发生冲突。
这个就叫做命名冲突。
因此C++引入了一个解决办法
namespace,就是这个把变量、函数、类型(结构体)来封装到命名空间里面。
我们来命名一个命名空间,把rand封装到里面。
这里打印的结果是访问的全局变量中的那个。
这里有两个rand的存在能同时发生是因为他们作用在不同的作用域中。
但是全局变量和局部变量如果优先访问的话实现访问局部的,再访问整体的。
那如果我们想要直接访问全局变量,那就要引入::,::也叫预作用限定符。
那我们想访问命名空间里面的变量呢?
用变量或者函数在编译默认查找时,默认先局部作用域,再全局作用域,这里默认不会到命名空间里面找。
命名空间里面除了定义变量,还可以定义类型和函数。
这里函数跟变量是一样的,这里再演示一下结构体类型。
命名空间可以实现嵌套,可以命名空间套命名空间。
总结:命名空间可以定义变量、类型和函数,命名空间也可以嵌套命名空间。一个命名空间是新建立了一个作用域,默认情况下是不会查找的。
多个文件里面可以定义同名的命名空间,同名的命名空间他会进行合并。如果合并的里面有同一个变量怎么办,合并了以后就是同一个域,同一个域里面是不能有同名的,也就是他们准确来说如果这样发生冲突,那他们就不能定义在同一个命名空间。
这里其实再继续嵌套命名空间也可以解决。
命名空间调,比如想调用一个命名空间里面的一个函数多次,那就太麻烦了。因此这里引入了
误区:展开命名空间并不是展开头文件。 展开头文件的意思是在预处理阶段把头文件都拷贝过来。命名空间是一个域,展开命名空间是影响编译器的查找规则。即展开后,编译时就可以访问这个变量了。
展开命名空间后,即使不指定调用哪一个命名空间里的值,他也不会报错。展开其实这里理解加了一个声明。但是展开命名空间有一个问题。如果别人也有这个值,就会出现这个问题。
下面是对访问的一些现象。
上面是用的全局的,后面是命名空间里面。不同的域里面是可以用同名的。
这里其实就是全局和命名空间的比较访问先后。
但是如果我们把全局那里也放到一个命名空间里面,那这个时候就会出现错误了。
结论:命名空间尽量不能随意展开。展开命名空间不是拷贝头文件,是一个声明。
其实这里可以展开命名空间一个单独的变量、类型或者函数。
命名空间其实总结下来也就3中访问方式:1.指定访问,但是重复访问麻烦。2.全部展开,这样做不太好。3.只展开其中的一个,哪一个常用就展开哪一个。
局部域和全局域会影响生命周期,命名空间域不会影响生命周期。这里解释一下:
下图的x和y还是全局变量,只不过用命名空间把名字进行了隔离,就是被人也可以定义。
局部域和全局域在分别完成了自己的进程后就进行结束,因而影响声明周期,而命名空间域不会影响声明周期。
C++的新输入新输出的引入。
但是把命名空间都展开不好,这里也可以指定进行展开。
std是库的命名空间.
灵活运用c或者c++的输入输出。
缺省参数的引入
缺省参数的意思就是在形参的后面给定一个值。
如果传递了实参,那么这个形参后面的值没什么用,但是如果实参没有传值,那么就会用形参后面的这个值即缺省值。
缺省参数可以有多个。但是实参传递时,不能跳跃传,必须按规定顺序传递。
上图的test2为全缺省,半缺省就是缺省一部分,只能从右向左缺省。
要注意的点:缺省参数不能声明和定义同时给。缺省参数在声明给。
2024.3.30更新
函数重载的引入
函数重载:是函数的一种特殊情况,C++允许在同一作用域中声明几个功能类似的同名函数,这些同名函数的形参列表(参数个数 或 类型 或 类型顺序)不同,常用来处理实现功能类似数据类型不同的问题。
展开命名空间不是将他放到全局了,展开就其实相当于放了个信标,就类似一个声明。
只有同一个域才会有重载关系。
声明一点:调用歧义和函数重载是不同的概念。
问题:C语言为什么不支持重载,C++为什么又支持重载。
一个工程的文件要运行起来必须经历的过程。
这里就简单一代而过:
引用的引入
引用的基本作用体现以下图来展现:
&在定义时是引用,在其他时候还是取地址的意思。
这里也用了顺序表在某些C语言书中也进行了引用。
对指针变量进行取别名
链表中对引用的利用
1.不用引用时。
2.利用了引用
3.有些学校的写法
引用的特性
1.引用在定义时必须初始化
2.一个变量可以有多个引用
3.引用一旦引用一个实体,再不能引用其他实体。
指针引用的一些点。
那如何可以呢?在引用前加一个const修饰符即可,用来防止权限的放大。这样就成了权限的平移。
权限的缩小
那这里如果y++,那么z会不会改变,是会的。这里只是x的值不能通过z来进行改变,因为z的权限仅仅是只读,但是y是可读可写的,因为y和z都是x的别名,所以通过y是可以改变他们的。
下图这样是可以的,它仅仅是把a的值赋值给了变量c
下图也是一种权限的放大
这里p1可以进行修改,而const修饰的*p1是不能进行修改的,这是c语言的知识。