一,命名空间
定义:就是一个可以由用户自己定义的作用域,在不同作用域中可以定义相同名字变量,互不干扰,系统能够区分。
格式:
cpp
namespace wd
{
int val1 = 0;
char val2;
}
在声明一个命名空间时,大括号内不仅可以存放变量,还可以存放:变量,常量,函数,结构体,引用,类,对象,模板,命名空间等------都称为实体。
调用:
cpp
int main(void)
{
count << wd::num << endl;
}
或者写到函数里面再在main中去调用这个函数:
cpp
namespace wd
{
int num = 10;
}
void test0()
{
cout << wd::num << endl;
}
int main(void)
{
test0();
return 0;
}
使用作用域限定的方式访问命名空间中的实体
优点:准确,只要命名空间中确实有这个实体,就能准确调用。
缺点:繁琐。
注意1:using 指令建议放到局部作用域去使用,它的效果是将命名空间中的实体引入,在using编译指令之后可以直接使用实体名称访问命名空间中的实体。
cpp
#include<iostream>
using namespace std;
namespace wd
{
int num = 10;
}
namespace wd2
{
int num = 20;
}
void test0()
{
using namespace wd;
cout << num << endl;
}
void test1()
{
using namespace wd2;
cout << num << endl;
}
int main(void)
{
test0();
test1();
return 0;
}
此处编译返回结果互不干扰程序可以正常运行。

如果作用域为整个程序会出现同一个名称出现二义性。
注意2:这种方式使用命名空间中的实体时,要注意避免命名空间中实体与全局位置实体同名。

注意3:在不清楚命名空间中实体的具体情况时,尽量不使用using编译指令。

cout是C++标准库std命名空间里的输出对象名,但是这里自定义的cout()函数会和using namesoace std;这个起了冲突。
using namespace std; // C++库中所有东西都是放到std命名空间中,
cout是可以自动识别实体的类型

二,缺省参数
2.1定义
cpp
#include<iostream>
using namespace std;
//缺省参数
void Func(int a = 0)
//int a = 0 ;
// 形参 缺省参数
{
cout << a << endl;
}
int main()
{
Func(10);//传递数值10
// 实参
Func();//未传递任何数
return 0;
}
缺省参数相当于先给函数中的形参附上一个默认值,当调用函数时给了具体的数值时则将具体数值输出,若没有调入参数时运行函数则输出缺省参数值。
上方代码执行结果如下图所示;

2.2缺省函数分类
2.2.1:全缺省参数
cpp
#include<iostream>
using namespace std;
void Func1(int a = 10, int b = 20, int c = 30)
{
cout << "a = " << a << endl;
cout << "b = " << b << endl;
cout << "c = " << c << endl;
}
int main()
{
Func1();
Func1(1);
Func1(1,2);
Func1(1,2,3);
return 0;
}

2.2.2:半缺省参数 //缺省部分参数 --- 必须从右往左连续缺省
cpp
#include<iostream>
using namespace std;
void Func2(int a, int b = 10, int c = 20)
{
cout << "a = " << a << endl;
cout << "b = " << b << endl;
cout << "c = " << c << endl;
cout << " " << endl;
}
int main()
{
//Func2();
Func2(1);
Func2(1, 2);
Func2(1, 2, 3);
return 0;
}
当形参中有缺失的时候必须给参数才能运行否则程序报错;

注:调用时如果要传参必须从左往右依次传参,不能空缺。

三,函数重载
3.1.1概念
函数重载允许你在同一个作用域(比如同一个类、同一个全局命名空间)中 ,定义多个函数名相同但参数列表不同的函数。---> 一词多义。
cpp
#include<iostream>
using namespace std;
//函数重载
//函数名相同,参数不同(类型 || 个数 || 顺序不同)
//类型不同
int Add(int left, int right)
{
return left + right;
}
double Add(double left, double right)
{
return left + right;
}
long Add(long left, long right)
{
return left + right;
}
//个数不同
void Sum(int a, int b)
{
}
void Sum(int a, int b, int c)
{
}
//顺序不同
void Func(int i, char ch)
{
}
void Func(char ch, int i)
{
}
int main()
{
return 0;
}
注:若只是返回值不同的情况下,不能构成重载。
在调用函数重载的调用中对应某种传参就直接对应重载函数去运行(自动执行);
eg:



3.1.2 C++是如何支持函数重载的?为什么C语言不支持
c/c++程序编译四个阶段:
1>预处理 -> 处理源代码中的预处理指令(如#include、#define等),展开头文件、替换宏,生成一个没有预处理指令的纯 C/C++ 文本文件(通常后缀为.i)。
2>编译 -> 对预处理后的文件进行词法分析、语法分析和语义分析,将其翻译成汇编代码(通常后缀为.s)。
3>汇编 -> 将汇编代码转换为机器能识别的二进制目标文件(通常后缀为.o或.obj)
4>链接 -> 将多个目标文件和系统库文件合并,解决函数和变量的引用问题,生成最终的可执行文件