目录
1. 命名空间
1.1 命名空间的定义
namespace txl
{
// 命名空间中可以定义变量/函数/类型/命名空间
int rand = 10;
int Add(int left, int right)
{
return left + right;
}
struct Node
{
struct Node* next;
int val;
};
namespace tt
{
int rand = 1;
} //命名空间的嵌套
}
同一个工程中允许存在多个相同名称的命名空间,编译器最后会合并同一个命名空间中。
std是C++标准库的命名空间。
1.2 命名空间的使用
- 作用域限定符:加命名空间名称及作用域限定符,eg: txl::rand
- 部分展开(授权):使用using将命名空间中某个成员引入
using N::b;
int main()
{
printf("%d\n", N::a);
printf("%d\n", b);
return 0;
}
- 全部展开(授权):使用using namespace 命名空间名称引入,eg: using namespce N;
注意:若展开部分和全局矛盾,则不能展开
2. 缺省参数
指函数有默认参数。
没有传参时,使用参数的默认值
传参时,使用指定的实参
1. 全缺省参数
void Func(int a = 10, int b = 20, int c = 30);
显示传参,从左往右显示传参
Func(1);
Func(1,2);
Func(1, 2, 3);
2. 半缺省参数
void Func(int a, int b = 10, int c = 20);
必须从右往左给缺省值
注意:. 缺省参数不能在函数声明和定义中同时出现,声明给缺省参数,定义不给(正常写)。
3. 函数重载
指:多个函数的名字,作用域相同,参数个数不同或参数类型顺序不同,它们返回值可相同,可不同,可没有。
int Add(int left, int right)
double Add(double left, double right)
4. 引用
int& ra = a; //ra是a的别名,两者地址相同,是同一块空间的不同名字
4.1 引用特性
- 引用在定义时必须初始化
- 一个变量可以有多个引用
- 引用一旦引用一个实体,再不能引用其他实体
4.2 引用使用场景
- 做参数,使形参改变实参
void Swap(int& left, int& righ) - 做返回值
注意:如果函数返回时,出了函数作用域,如果返回对象还在(还没还给系统),则可以使用,例如:静态变量,堆上的变量
引用返回,如果已经还给系统了,则必须使用传值返回。
4.3 引用优点
- 传引用传参(任何时候都可以用)
1、提高效率,若用二级指针传参,则还需要解引用
2、输出型参数(形参的修改,影响的实参) - 传引用返回(出了函数作用域对象还在才可以用)
1、提高效率,不用去创建临时变量
2、修改返回对象
4.4 引用权限
- 在引用的过程中,权限可以平移,权限可以缩小,权限不能放大。
临时变量具有常性。
int func()
{
int a = 0;
return a;
}
int main()
{
//关于引用权限
const int a = 0;
// 权限的放大
// int& b = a; 错误
//int b = a; 可以的,因为这里是赋值拷贝,b修改不影响a
// 权限的平移
const int& c = a;
// 权限的缩小
int x = 0;
const int& y = x;
//关于临时变量的创建和常性
int i = 0;
const double& d = i; //两者类型不同,会创建临时变量,所以这是权限的平移
const int& ret = func(); //传值返回,会创建临时变量,所以这是权限的平移
return 0;
}
5. 内联函数
宏函数的缺点
1、容易出错,语法坑很多
2、不能调试
3、没有类型安全的检查
宏函数的优点
1、没有的类型的严格限制
2、针对频繁调用小函数,不需要再建立栈帧,提高了效率
5.1 概念
以inline修饰的函数叫做内联函数,编译时C++编译器会在调用内联函数的地方展开,没有函数调用建立栈帧的开销,内联函数提升程序运行的效率。
5.2 特性
- inline是一种以空间换时间的做法,如果编译器将函数当成内联函数处理,在编译阶段,会用函数体替换函数调用,缺陷:可能会使目标文件变大,优势:少了调用开销,提高程序运行效率
- 内联说明只是向编译器发出的请求,一般若函数超过10行,编译器会自动忽略这个请求
- inline不建议声明和定义分离,要在同一个文件内,分离会导致链接错误。因为inline被展开,不会生成符合表,就没有函数地址了,链接就会找不到。
- 可以在多个文件中定义同一个内联函数,因为内联函数被展开,项目不会生成符合表多个相同函数地址,不会产生冲突
- 直接将内联函数定义放在头文件即可,要用内联函数,包个头文件就好
6. auto关键字
auto自动推导类型
int a=0;
//int b=a;
auto b=a;
// 范围for
// 依次取数组array中的数据赋值给e
// 自定判断结束
// 自动迭代
int array[] = { 1, 2, 3, 4, 5 };
for (auto e : array)
{
cout << e << " ";
}
void TestFor(int array[])
{
for (auto& e : array) //在这里报错,array必须为数组名,array在这里其实是指针
cout << e << endl;
}
6.1 auto不能推导的场景
- 不能做参数
- 不能声明数组
7. 指针空值nullptr
c语言:#define NULL ((void *)0) //NULL实际是一个宏
c++ :#define NULL 0
#define nullptr ((void *)0)