命名空间的引入
C语言的缺陷以及C++的解决。
看下面这个代码:
这里进行了报错。
这里包含rand所在的头文件,然后头文件会进行展开。然后头文件里的rand和全局变量rand就会发生冲突。
这个就叫做命名冲突。
因此C++引入了一个解决办法
namespace,就是这个把变量、函数、类型(结构体)来封装到命名空间里面。
我们来命名一个命名空间,把rand封装到里面。
这里打印的结果是访问的全局变量中的那个。
这里有两个rand的存在能同时发生是因为他们作用在不同的作用域中。
但是全局变量和局部变量如果优先访问的话实现访问局部的,再访问整体的。
那如果我们想要直接访问全局变量,那就要引入::,::也叫预作用限定符。
那我们想访问命名空间里面的变量呢?
用变量或者函数在编译默认查找时,默认先局部作用域,再全局作用域,这里默认不会到命名空间里面找。
命名空间里面除了定义变量,还可以定义类型和函数。
这里函数跟变量是一样的,这里再演示一下结构体类型。
命名空间可以实现嵌套,可以命名空间套命名空间。
总结:命名空间可以定义变量、类型和函数,命名空间也可以嵌套命名空间。一个命名空间是新建立了一个作用域,默认情况下是不会查找的。
多个文件里面可以定义同名的命名空间,同名的命名空间他会进行合并。如果合并的里面有同一个变量怎么办,合并了以后就是同一个域,同一个域里面是不能有同名的,也就是他们准确来说如果这样发生冲突,那他们就不能定义在同一个命名空间。
这里其实再继续嵌套命名空间也可以解决。
命名空间调,比如想调用一个命名空间里面的一个函数多次,那就太麻烦了。因此这里引入了
误区:展开命名空间并不是展开头文件。 展开头文件的意思是在预处理阶段把头文件都拷贝过来。命名空间是一个域,展开命名空间是影响编译器的查找规则。即展开后,编译时就可以访问这个变量了。
展开命名空间后,即使不指定调用哪一个命名空间里的值,他也不会报错。展开其实这里理解加了一个声明。但是展开命名空间有一个问题。如果别人也有这个值,就会出现这个问题。
下面是对访问的一些现象。
上面是用的全局的,后面是命名空间里面。不同的域里面是可以用同名的。
这里其实就是全局和命名空间的比较访问先后。
但是如果我们把全局那里也放到一个命名空间里面,那这个时候就会出现错误了。
结论:命名空间尽量不能随意展开。展开命名空间不是拷贝头文件,是一个声明。
其实这里可以展开命名空间一个单独的变量、类型或者函数。
命名空间其实总结下来也就3中访问方式:1.指定访问,但是重复访问麻烦。2.全部展开,这样做不太好。3.只展开其中的一个,哪一个常用就展开哪一个。
局部域和全局域会影响生命周期,命名空间域不会影响生命周期。这里解释一下:
下图的x和y还是全局变量,只不过用命名空间把名字进行了隔离,就是被人也可以定义。
局部域和全局域在分别完成了自己的进程后就进行结束,因而影响声明周期,而命名空间域不会影响声明周期。
C++的新输入新输出的引入。
但是把命名空间都展开不好,这里也可以指定进行展开。
std是库的命名空间.
灵活运用c或者c++的输入输出。
缺省参数的引入
缺省参数的意思就是在形参的后面给定一个值。
如果传递了实参,那么这个形参后面的值没什么用,但是如果实参没有传值,那么就会用形参后面的这个值即缺省值。
缺省参数可以有多个。但是实参传递时,不能跳跃传,必须按规定顺序传递。
上图的test2为全缺省,半缺省就是缺省一部分,只能从右向左缺省。
要注意的点:缺省参数不能声明和定义同时给。缺省参数在声明给。