namespace本质上是定义了一个命名空间域
通过创建命名空间域可以预防变量的冲突问题
命名冲突时,编译器会首先从局部中找,然后从全局中找,但是不会从命名空间中找
eg.
::符号和命名空间
:: 是域作用限定符
就可以访问namespace bit中的rand了,否则就默认找局部或全局的rand
调用命名空间中的结构体
命名空间中可以定义变量,函数等,也可以定义其他命名空间
对于不同头文件来说,可以设置相同名字的命名空间,他们会自动合成成一个命名空间
但是两个头文件中不能有同名的函数(因为在同一个域内)
展开命名空间
对于命名空间中的封装的内容,不能省略前缀xx::xx
如果要省略,必须using namespace(展开命名空间)
之后使用的内容就会首先从局部中找,然后同时从全局中找和命名空间中找
对于某个使用频率较高的内容,可以单独展开某一个
eg.
cin,cout
cin和cout被包含于c++的库的命名空间(std)中,因此在使用他们时需要加前缀std::
但是cin和cout的使用频率很高,为了方便,可以using namespace std来省略std::
或者指定展开cin和cout
using std::cout
using std::cin
using std::endl
但是cin和cout的效率要比printf和scanf低一点
缺省参数
在函数设置形参时可以赋值,如果调用该函数时没有传参,则会用缺省参数初始化,
如果正常传参,就用传入的参数初始化
缺省参数可以有多个
eg.
全缺省
半缺省
规定只能从右往左缺省,也不能跳跃着缺省
此时函数的调用就有很多中方式了
但是函数传参必须按顺序传入,不能跳过前面的参数直接传入后面的参数
缺省参数不能同时声明和定义,缺省参数最好在声明时给
函数的重载
对于c语言,在同一作用域中不允许同名的函数同时存在,否则函数名会冲突
但是在c++中,在同一作用域中可以存在同名的函数,叫做函数的重载
但是,函数的重载要求函数的参数不同(类型,数量)(返回值不同不构成函数的重载)
在调用函数时,编译器会根据传入参数的个数或类型来调用相应的函数
C++支持函数重载的原因
调用函数的本质是调用函数的地址(函数中执行的首个语句的地址(类似于数组的地址))
当包含头文件和源文件时,编译器执行程序时,先展开头文件,经过一定流程,然后检查语法,生成汇编代码,但此时由于头文件中只有函数的声明,没有定义,所以无法找到函数的地址(首个语句的地址)
因此需要在编译器进行链接时查找函数的地址
在编译器进行链接时,
c语言直接用函数的名字去查找函数
c++直接用修饰(参数的类型,个数等)后的函数的名字去查找