1.namespace命名空间
1.1 namespace的定义
- 命名空间的定义需要用到namespace关键字,在namespace后面加上空间的名字,然后再加上大括号{}即可。里面可以定义变量/函数/子命名空间/类型等
- 命名空间只能定义在全局,而不能定义在局部。
- C++域中有函数局部域、全局域、命名空间域、类域;域影响的是程序在编译过程中查找一个变量/类/函数的出处(声明或定义)时的逻辑,所以有了域的隔离,就不用担心重复命名的问题了。局部域和全局域除了会影响编译查找逻辑,还会影响函数/变量的生命周期。命名空间和类域不会影响变量的生命周期。
- 项目工程中多文件定义同一个名字的命名空间时会认为这是同一个命名空间,会将不同文件的同一名称的命名空间合并为同一个命名空间。
- C++的标准库都存放在一个叫std(standard)的命名空间内。
namespace Chen
{
//定义变量
int a = 10;
//定义函数
int Add(int a, int b)
{
return a + b;
}
//定义子命名空间
namespace Chen_
{
int a = 5;
double b = 2.11;
}
}
1.2 命名空间的使用
在使用变量或者函数的时候,默认都只在局部域和全局域去查找,如果直接使用命名空间里的函数或者变量程序会报错,这里介绍一下命名空间的使用方式:
- 指定命名空间进行访问(推荐这种)
- 用using关键字将命名空间展开,然后访问(不推荐,因为在做大工程项目时容易出问题,在平时做小练习的时候可以展开)
namespace Chen { //定义变量 int a = 10; //定义函数 int Add(int a, int b) { return a + b; } //定义子命名空间 namespace Chen_ { int a = 5; double b = 2.11; } struct Stack { int* val; int top; // 栈顶 int capacity; // 容量 }; } //一般的命名空间的展开 using namespace Chen; //当我们需要使用这种自定义变量的时候会有大量的重复代码,这时就可以考虑展开某个变量来节省时间 using Chen::Stack; using Chen::a; int main() { //展开前的使用方式 printf("%d ", Chen::a); Chen::Stack s1; s1.capacity = 4; //展开后的使用方式 printf("%d ", a); Stack s1; s1.capacity = 4; return 0; }
2.缺省函数
- 缺省参数是指在函数的定义或者声明时给函数一个默认值,在当调用函数时,若没有传递参数,则使用该默认值,以保证函数的正常运行。缺省参数分为半缺省参数和全缺省参数。
- 全缺省参数就是将全部的参数都给上一个默认值,而半缺省参数就是将一部分赋给默认值。半缺省参数只能从右往左赋值,不能间隔跳跃式地给默认值。
- 在调用缺省函数的时候要从左向右地赋值,不能间隔跳跃式地传递参数。
- 当函数的定义和声明分离时,缺省参数不能同时在定义和声明中同时赋值,规定必须在声明内赋值。
3.引用
这里对引用只做大概的介绍,后续会出更详细的关于引用的博客。
3.1引用的概念
引用不是新定义一个变量,而是给已存在变量取了一个别名,编译器不会为引用变量开辟内存空间,它和它引用的变量共用同一块内存空间。
就像《水浒传》里的杨志外号叫青面兽,所以引用可以看作我们给变量取了一个外号而已。
3.2引用的语法
语法:类型名+& = 变量名;
int a = 10;
int& b = a;
这里可以看到a和b所指向的空间是一样的,那我们对b进行修改会不会引起a的变化
明显看到a也发生了变化 。
3.3 引用的特性
- 引用在定义时必须初始化
- 一个变量可以有多个引用
- 一个引用可以继续有引用
- 引用一旦引用一个实体,再不能引用其他实体
- 可以对任何类型做引用【变量、指针…】
引用在定义时必须初始化:
一个变量可以有多个引用:
这样意味着这个变量有了多个“外号”
一个引用可以继续有引用:
就像是a = b = c = d
引用一旦引用一个实体,再不能引用其他实体:
3.4 引用的使用
举个最简单的案例,两数交换。
//这是我们学C语言的时候用的传递变量指针的方式来交换
void Swap1(int* a, int* b)
{
int tmp = *a;
*a = *b;
*b = tmp;
}
//这是引用的方式
void Swap2(int& a, int& b)
{
int tmp = a;
a = b;
b = tmp;
}
根据我们前面所讲,int& a = a; int& b = b;
这里做一个比喻:
指针的方法就是将储存物品的门牌号告诉你,然后你在函数里面通过门牌号进入房间然后将两个房间里面的物品交换。
而引用就像直接给你物品,你直接在函数里面将他们完成交换就可以了,这一点比指针貌似更方便了些