一· namespace关键字(解决C语言中命名冲突的问题):编译时,使用的变量或函数得找到它的定义,当同一块域内有两个相同的名字编译器就不知道调用谁,从而引发冲突
这里rand函数与rand变量重名引发的命名冲突
C++中的域:局部域,全局域,命名空间域,类域。将域进行隔离就可以解决命名冲突的问题
定义命名空间,需要使用到namespace关键字,后面跟命名空间的名字,然后接一对{}即可,{} 中即为命名空间的成员,成员可以是函数,变量,类型。
注意:命名空间只能定义在全局中,但可以进行嵌套
2 域作用限定符(::)默认去全局域查找,在前面加上域名就去指定的地方查找
#include <stdio.h>
#include <stdlib.h>
namespace git
{
namespace bit
{
int hp(int a,int b)
{
return a + b;
}
}
namespace pit
{
struct hp
{
int pg;
int bg;
};
}
}
int a = 3;
int main()
{
struct git::pit::hp ad;
ad.bg = 90;
printf("%d\n",ad.bg);
printf("%d\n", git::bit::hp(2,2));
return 0;
}
注意:在指定结构体命名空间时应把域指定符放在类型名前面。
3 相同名字的命名空间域会被看成同一个名字空间域,而不会引发命名冲突(C++的标准库封装在std的命名空间里)
关键字2 using(用于展开命名空间,一般不推荐使用)
例1 全部展开命名空间
例2 展开部分命名空间
二·C++的输入输出
<iostream>标准输入输出流的库文件
1. 使用cout标准输出对象(控制台)和cin标准输入对象(键盘)时,必须包含< iostream >头文件 以及按命名空间使用方法使用std。
2. cout和cin是全局的流对象,endl是特殊的C++符号,表示换行输出,他们都包含在包含< iostream >头文件中。
3. 是流插入运算符,>>是流提取运算符。
4. 使用C++输入输出更方便,不需要像printf/scanf输入输出时那样,需要手动控制格式。 C++的输入输出可以自动识别变量类型。(只有内存里才有原反补,浮点存储等等,其他都是把类型强转成字符型在输出)
5. 实际上cout和cin分别是ostream和istream类型的对象,>>和也涉及运算符重载等知识, 这些知识我们我们后续才会学习,所以我们这里只是简单学习他们的使用。
三· 缺省参数
缺省参数是声明或定义函数时为函数的参数指定一个缺省值。在调用该函数时,如果没有指定实 参则采用该形参的缺省值,否则使用指定的实参(相当于给形参一个初始化)。
缺省参数又分全缺省和半缺省
半缺省
1·半缺省参数必须从右往左依次来给出,不能间隔着给
2. 缺省参数不能在函数声明和定义中同时出现
例
注意:半缺省没有设置缺省值的必须传入实参
函数声明和定义分离时,规定在函数定义处给缺省值,不能在声明处给缺省值,避免冲突
四·函数重载
概念:是函数的一种特殊情况,C++允许在同一作用域中声明几个功能类似的同名函数,这 些同名函数的形参列表(参数个数 或 类型 或 类型顺序)不同,常用来处理实现功能类似数据类型 不同的问题。
但要注意一个坑
如:
这两个函数构成函数重载但是在调用f1()时,编译器不知道调用那一个,应尽量避免歧义(不要这样写)