命名空间
C语言阶段定义一个变量或函数时,有可能变量或函数名会与库内名字或第三方库内的变量或函数名称相同,C++有一个命名空间(namespace lx
),来在一定程度上解决命名冲突。
使用域作用限定符 “::” 来访问空间内的变量,消除歧义。
在命名空间内什么都可以定义,变量,类,结构体,函数…………。
不同头文件内的同名命名空间会自动合并。如每个库头文件内都有std,同时包含多个头文件,每个头文件中的std都会自动合并。
// namespace关键子,用来定义命名空间,后面跟上命名空间的名称
namespace lx
{
struct Add{};
}
// 访问结构体时,命名空间加在struct后面。
struct lx::Add();
// 在代码中用的比较多的可以使用部分展开
using lx::Add;
int main()
{
struct Add(); // 自动识别为lx命名空间内的
}
// 命名空间完全展开,展开之后,就不需要通过域作用限定符 :: 来访问了,一般不推荐命名空间完全展开
using namespace lx;
int main()
{
struct Add(); // 自动识别为lx命名空间内的
}
// 命名空间可以嵌套定义
bit::lx::Add;
namespace bit
{
namespace lx
{
void Add(){};
}
}
缺省参数
缺省参数是声明或定义函数时为函数的参数指定一个缺省值在调用该函数时,
若没有指定实参, 则采用该形参的缺省参数.
全缺省
// 其中a和b就是缺省参数,在调用时,如果没有给函数传入参数,在调用时就会使用默认值
void Add(int a = 10, int b = 5)
{
return a + b;
}
// void Add(int a = 10, int b);
// 这样是不被允许的,缺省参数后面的参数都只能是缺省参数
调用方式:
1. 直接调用, 不传参数.
Add();
2. 传一个参数
Add(100);
此时, a的值就是100,
而 b 的值就是默认的缺省值 5.
3. 传两个参数
Add(100, 200);
此时, a的值就是100,
而 b 的值就是 200.
半缺省
半缺省则是部分参数有缺省值.
void Func(int a, int b = 20, int c = 30)
{
cout << "a = " << a << endl;
cout << "b = " << b << endl;
cout << "c = " << c << endl;
}
只要有参数没有给缺省值
那么它就是半缺省的
注意:
1. 半缺省参数, 必须从左向右依次给出, 不能跳跃.
2. 缺省参数不能在函数声明中同时定义. 声明与定义分离时, 规定声明给, 定义不给.
3. 缺省值必须是常量, 或全局变量.
void Func(int a = 10, int b, int c);
void Func(int a, int b = 20, int c);
// 确实参数的右边都要是缺省参数
函数重载
C语言不允许出现同名函数,C++允许,但要求实现函数重载。
重载条件: 函数名相同,参数类型不同,或顺序不同,或参数数量不同。返回值不做要求。要求在同一个域里面,不同域不构成重载。
同一个参数是否为缺省参数不成为构成重载的条件如 func(int a)和func(int a = 1)之间不构成重载。类型相同,不符合条件。
int add(int a, int b)
{}
int add(int a, float b) // 参数类型不同
{}
int add(float a, int b) // 参数顺序不同
{}
int add(int a, int b, int c) // 参数数量不同
{}
// 以上都构成函数重载,下面的都不构成重载
namespace lx
{
int add(int a, int b, float c) // 不在同一个域内
{}
}
int add(int a = 1, int b) // 缺省参数并不算参数类型不同
{}
float add(int a, int b) // 返回值不作为评判条件
{}