一.C语言命名冲突问题
与C语言不同的是C++添加源文件的后缀是cpp
C++是兼容C语言的用C语言的语法可以在C++上运行
用C++语法来运行
我们知道c++是来补充c语言不足的地方
这个程序在没包头文件之前是可以正常运行的
当我包含头文件#include<stdlib.h>的时候程序就运行失败
原因是出现命名冲突的问题
冲突分三种:库,我和项目组同事
1.库:官方库和C++库
跟库冲突解决办法把名字稍微更改一下
2.我和项目组同事的名字冲突
解决办法只能让另外一个人把名字改一下
1.2C++命名空间
C++就提出命名空间来解决C语言命名冲突的问题
namespace std(局部)
std是C++标准库的命名空间,C++中所有的东西都会放到这个命名空间里
避免两个人定义的东西冲突
这里rand访问有两种方式:
1.访问stdlib库里面的rand,库里面rand访问要加p指针
2.访问命名空间里面的rand,命名空间的访问要加名称和域作用限定符::
std :: rand
1.2命名空间的定义
命名空间里面什么都可以定义,函数,结构和变量
函数的调用
如果这个函数不加std::会出错,因为函数在默认情况下会去全局查找
不会自己到命名空间里面查找
结构体的调用
这里要注意的是std::不能放在struct的前面这种写法是错误的,因为定义的Node而不是strcut
现在即使在命名空间外定义相同函数变量的名称也不存在
因为名字相同而导致的命名冲突问题
1.3展开命名空间
using namespace std (公共)
每次打印这个函数都要写域限定太麻烦了,这时我们就可以用展开命名空间
默认情况不会去命名空间找定义,现在展开命名空间就可以去找定义了
展开命名空间很危险
这样会导致编译器不知道去库里面找还是去命名空间里面找
哪怎么办呢?
可以用部分展开的方式来解决
using std:: Add(部分)
这样就不会导致全部展开出现冲突的风险
1.4命名空间嵌套使用
如果我还要定义一个rand这时就可以嵌套使用
打印的话就在std基础上在定义
通过上述的讲解
我们就能很轻松解释下面的代码
出错的原因是cout 和endl都定义在iostream头文件中
头文件里面是把这些都封装到namespace std命名空间中
默认情况下不会去命名空间找,就报错不认cout和endl
解决办法有4种:
1.展开命名空间
2.局部展开授权
3.快捷方式
4.cin>>
注意:头文件的展开是把头文件的内容拷贝过来
命名空间的展开是命名空间的授权
命名空间同名会自动合并
1.5<<流插入和提取>>
i是in输入数据,o是out输出数据
cout里c是控制台的意思Console,out输出控制台输出
<<流插入运算符
endl换行符,也可以写成\n
cin里c也是控制台的意思console,in输入控制台出入
>>流提取
C++使用cout和cin的好处是可以自动识别类型
不像之前写c语言的时候打印或者输入都要带类型
如果想控制小数点精度就用c语言因为c和c++可以混着使用
用c++会很麻烦
需要注意的是有的很老的编译包头文件会出现这种情况
下载新的编译器不能这样使用
二.缺省参数
2.1默认缺省参数
当我们调用第一个函数Fun=2传参数时,int a 就等于2这时1就不用了
调用第二个函数Fun = 0不传参数时,int a 就等于1
函数传参数就数不用a自用传的参己的值,如果函数没有传参数就用a自己的值
这里的a就是缺省参数或默认参数
2.2全缺省参数
可以传1个2个3个也,能灵活可以不传使用
如果传1个参数是默认传给第一个的,不能传给第2个和第3个
显示传参从左往右显示传参
2.3半缺省
不能不传参数,至少传一个参数
必须从右往左给缺省值
不然会报错
缺省参数的声明和定义不能分离
如果分离你在定义和声明各给一个缺省值
编译器就不知道用哪一个缺省值
非要的分离的话不能同时给,声明给定义不给
三.函数重载
通俗理解就是一词多义
在c语言中不准许同名函数
c++可以要求构成函数重载
构成函数重载的要求
1.同一个作用域;
2.函数名称相同;
3.函数参数类型
4.参数个数不同
5.参数类型顺序不同
3.1参数类型不同
构成函数重载,会自动匹配类型不需要我们输入类型的打印符号了
输出结果
在c语言中函数名必须要不同不然会报错
3.2参数个数不同
3.3参数类型顺序不同
必须是类型不同,而不是参数
函数返回类型不同是构成不了函数重载的
想让函数返回类型不同构成函数重载
函数参数的类型必须不同
3.4在同一个作用域
这种情况是不构成函数重载的
因为不在同一个作用域内
哪有人就会问了,不是函数重载为什么不报错呢?
他们不在同一个作用域,即使名字和参数类型相同也不会报错
这种情况就会报错
还有一种情况要注意
函数重载和半缺省结合
当函数传参传2个值的时候调用第二个函数正常运行
因为第二个函数有2个函数参数a和b,而第一个函数只有一个参数
当传1个参数就会发生调用歧义
因为第一个函数有缺省参数,第二个函数也有缺省参数
编译器不知道调用哪一个就会发生歧义
本小节结束,点个赞和关注吧!!!