目录
命名空间
C语言中同一个函数名或变量名或结构名不可以出现在同一个作用域中, 命名空间是C++引入的一个概念, 为了预防C语言中不经意间出现重名的变量,函数或结构的情况.
定义命名空间用namespace + 命名空间名 + {} 组成,大括号中声明变量,函数等
namespace zyc //zyc为命名空间的名字
{
//定义变量
int add;
//定义函数
int sub(int x, int y)
{
return x - y;
}
//定义结构
struct List
{
int val;
struct List* next;
};
} //注意这里不加分号
命名空间允许嵌套
namespace zyc
{
namespace data //在命名空间zyc中定义命名空间data
{
//不同命名空间中的变量名,结构名,函数名允许相同
int add;
int sub(int x, int y)
{
return x - y;
}
struct List
{
int val;
struct List* next;
};
short a;
char b;
}
int add;
int sub(int x, int y)
{
return x - y;
}
struct List
{
int val;
struct List* next;
};
}
在同一个项目中如果有两个相同名字的命名空间, 编译时期会把两个命名空间合并到一起
所以相同名字的命名空间内不能有相同的变量,结构,函数
命名空间必须写在全局上
命名空间就是定义了一个新的作用域,命名空间的内容都属于这个作用域中
命名空间的使用
1.使用作用域限制符::访问命名空间的内容
//定义命名空间
namespace zyc
{
int a;
}
int main()
{
//访问命名空间zyc中的a变量
zyc::a = 10;
printf("%d\n", zyc::a);
return 0;
}
//这样写等同于
int a;
int main()
{
a = 10;
printf("%d\n", a);
}
2.使用using展开命名空间
namespace zyc
{
int a;
char b;
int add(int x, int y)
{
return x + y;
}
}
//把命名空间zyc展开 注意结尾要加分号
using namespace zyc;
int main()
{
a = 10;
printf("%d\n", a);
return 0;
}
//展开后等同于以下代码
int a;
char b;
int add(int x, int y)
{
return x + y;
}
int main()
{
a = 10;
printf("%d\n", a);
return 0;
}
这样写会把命名空间展开,如果命名空间外面有和命名空间内相同变量名的内容则还会报错
3.展开指定的变量
namespace zyc
{
int a;
char b;
int add(int x, int y)
{
return x + y;
}
}
//只将a变量解放 变量b 函数add仍然在命名空间内
using zyc::a;
int main()
{
a = 10;
printf("%d\n", a);
return 0;
}
//等同于以下代码
namespace zyc
{
char b;
int add(int x, int y)
{
return x + y;
}
}
int a;
int main()
{
a = 10;
printf("%d\n", a);
return 0;
}
命名空间就像一个盒子,把你要定义的内容放在这个盒子里,封装起来,到了想用的时候再打开.这样避免与别的变量名冲突
缺省参数
在C++中声明函数时可以直接对形参赋一个初始值,当调用这个函数时不传输实参时,形参将会使用提前声明的初始值
void print(int x = 0)
{
cout << x << endl;
}
int main()
{
//给参数100
print(100); //结果打印100
//不指定参数
print(); //结果打印默认值0
return 0;
}
如果一个函数有多个参数时,且参数都指定了默认值 则称之为全部缺省, 即可以全部省略参数
//全部缺省函数
void test(int a = 0, char b = '+', void* p = NULL) //调用时如果不给与实参则 a = 0, b = '+', p = NULL
{
return;
}
有了全部缺省就有部分缺省
部分缺省必须从右往左缺省 ,
void test(int a , int b = 0, int c = 0) //b 和 c 缺省
{
cout << a << endl;
cout << b << endl;
cout << c << endl;
}
//这样是错的 必须从右往左缺省 不可以跳过
void test(int a = 0, int b = 0, int c)
{
cout << a << endl;
cout << b << endl;
cout << c << endl;
}
重载函数
重载函数是指函数名相同但功能有不完全相同的函数
C++允许在同一个作用域中声明相同的函数名, 但是这些函数的形参的类型,顺序或个数 必须不完全相同
int add(int x, int y)
{
return x + y;
}
double add(double x, double y)
{
return x + y;
}
int main()
{
cout << add(1, 2) << endl; //执行int的函数
cout << add(1.3, 2.2) << endl; //执行double的函数
return 0;
}