目录
命名空间
概念
命名空间是在全局域中开辟出一个独立的作用域,这个作用域中可以定义变量,函数,类等,作用域内定义的实体,允许重名。
用法
必须在全局作用域内
定义时:
namespace a
{
class tab
{
public:
int a;
};
int a = 10;
int add(int a, int b)
{
return a + b;
}
}
使用时,需要作用域限定符::
int main()
{
a::tab x;
x.a=10;
printf("%d\n",a::a)
return 0;
}
作用
编程中可能会出现大量的同名的实体,命名空间避免了这一问题。
特性
1、改变了查找的规则
C++中默认的查找规则是局部变量优先,如果局部变量找不到,那么报错,查找的顺序是从下到上,命名空间限定后,直接到命名空间中查找,如果找不到就会直接报错。
2、全局定义,不影响实体的生命周期
命名空间的实体是全局的,生命周期随着整个工程,不会因为是在{}内,括号结束就结束。
3、名字相同的作用域会自动合并
a头文件中进行如下定义
#include<iostream>
#include<stdlib.h>
namespace bit
{
int a = 10;
}
b头文件中进行如下定义
namespace bit
{
int b = 5;
}
int main()
{
printf("%d\n", bit::a);
printf("%d\n", bit::b);
system("pause");
return 0;
}
使用时,a,b头文件中会在编译阶段自动进行合并,合并的规则是同级同名的才会合并。
注意事项
使用时总是加上命名空间名比较麻烦,可以选择部分简化或者全部简化
部分简化命名空间名,是指对命名空间中的实体使用using命令,可以在使用时方便一些。
格式: using N::XX(N为命名空间名,XX为实体名)。
全部简化命名空间名,是指对命名空间使用using命令,使用时完全不加命名空间名,但是会有冲突。
格式: using namespace N。
使用场景
命名空间适合全场景使用,特别是大型项目,多人协作,可以多人编辑一个命名空间的内容,也可以多人编辑多个命名空间的内容。
缺省参数
概念
缺省参数是给函数的参数设一个默认值,当没有合适的实参传递给参数时,函数会使用默认的参数。
用法
int add(int a=10, int b=5)
{
return a + b;
}
int main()
{
printf("%d\n", add());
system("pause");
return 0;
}
作用
在不确定参数时,可以先使用默认参数。
特性
1、分为全缺省与半缺省。
全缺省
int add(int a=10, int b=5)
{
return a + b;
}
半缺省
int add(int a, int b=5)
{
return a + b;
}
2、C语言不支持
注意事项
1、缺省必须从右到左。
int add(int a, int b=5)
{
return a + b;
}
从左到右缺省,会在编译时报错。
2、声明和定义不可重复,因为声明和定义可能不统一,编译器不知道用哪一个,缺省放在声明里比较好(编译时报错)。
3、缺省值必须是常量或者全局变量,否则编译器无法确定参数大小,无法开辟栈帧。
使用场景
缺省参数实用的地方在开辟栈上,比如一个栈无法确定大小时,可以使用缺省参数先开辟。
void StackInit(Stack* ps,int x)
{
assert(ps);
int newcapacity = x;
Datetype* newps = (Datetype*)malloc(sizeof(Datetype)*newcapacity);
if (newps == NULL)
{
perror("malloc fail");
return;
}
ps->_Date = newps;
ps->_Top = 0;
ps->_Capacity = newcapacity;
}
函数重载
概念
相同的作用域,同名但参数列表不同的函数,编译器通过实参的类型判断调用哪个函数,影响调用的有参数类型,参数个数,参数次序不同
用法
int Add(int a, int b)
{
return a + b;
}
double Add(double a, double b)
{
return a + b;
}
int main()
{
std::cout << Add(1,2) << std::endl;
std::cout << Add(1.2, 2.5) << std::endl;
system("pause");
return 0;
}
作用
为了避免同名函数的冲突。
特性
1、编译时,编译器会将函数名及其之后的参数类型合并修饰成新的函数名,放入符号表,所以影响修饰后的函数名的几个因素是函数名,参数类型,参数类型的个数,参数类型的次序。
比如ADD(int a,float c)编译器修饰后为,ADDIF;
2、调用时,编译器会按照实参的类型进行推演,根据推演调用合适的函数。
注意事项
1、C语言不支持函数重载。
2、函数重载与参数类型有关
double Add(double a, double b)
{
return a + b;
}
double Add(double a, int b)
{
return a + b;
}
double Add(int a, double b)
{
return a + b;
}
double Add(int a, double b,double c)
{
return a + b + c;
}
3、返回值不能作为函数重载的依据,返回值可以加入到函数名里面,但是调用时不能确定返回值的类型,会产生二义性。
使用场景
函数重载适合用于多个函数同名的场景。
总结
命名空间可以使变量重名,函数重载可以是函数重名,缺省参数是给函数形参一个默认的值。