本片博客是作者在学习c++的过程中的笔记记录,希望和各位读者一起学习交流
引用
-
引用概念:
引用可以看做是一个已定义变量的别名
语法:type & name = var; 通过name可以操作var指向的内存 -
引用是c++的语法范畴
-
普通引用在声明的时候必须用其他变量进行初始化
引用作为函数参数声明时不进行初始化
普通变量做函数参数:在主调函数进行调用的时候,将拷贝一份数据给形参
引用做函数参数:在主调函数进行调用的时候,形参的意思就是实参的别名
指针做函数参数:在主调函数进行调用的时候,将地址传给形参 -
引用的意义:
引用作为其他变量的别名而存在,因此一些场合可以替代指针
引用相对于指针有更好的可读性和实用性 -
引用的本质:(引用在定义的时候就必须进行初始化,而const修饰的常量在定义的时候也必须进行初始化)
- 引用在c++内部实现是一个指针常量
eg:type &name === type *const name - c++编译器在编译过程中使用常指针作为内部的实现,因此引用所占的空间大小于指针相同
- 从使用的角度,引用会让人误会其只是一个别名,没有自己的存储空间。这是c++为了实用性做出的细节隐藏
- 引用在c++内部实现是一个指针常量
-
函数返回值是引用(当返回引用的时候返回的是地址)
1. 当返回的是栈变量(局部变量)的时候,不能成为其他引用的初始值,不能作为左值使用,因为在函数结束的时候,会释放局部变量,这种返回引用是非法的。
2. 若返回的是静态变量或者是全局变量的时候(内存空间没有释放),既可以作为右值使用,也可以作为左值使用
3. 函数返回值和返回引用区别
函数返回值会产生一个临时变量作为函数函数返回值的副本,返回引用时返回对象本身(因此可以做左值) -
指针的引用
用法:
int a = 0;
int * b = &a;
int * &c = b; -
常引用:让变量拥有只读属性
用法:
用变量初始化引用
int a;
const int &b = a;
a = 1;//正确
b = 2;//错误
用字面量初始化引用
const int a = 40;//c++编译器会将a放在符号表中
int &a = 41;//错误 引用就是给一个内村起别名,但是41没有地址
const int &m = 43;//正确,会给43分配内存空间
c++对c的函数扩展
- inline内联函数
c++中的const常量可以替代宏常数定义
如:const int A = 3; #define A 3
c++中可以使用内联函数代替宏代码片段
c++中使用inline关键字声明内联函数
内联函数声明时inline关键字必须和函数定义(函数的实现)结合在一起,否则编译器会直接忽略内联请求
结论:- 内联函数在编译时直接将函数体插函数调用的地方
- inline只是一种请求,编译器不一定允许这种请求
- 内联函数省去了普通函数调用时压栈,跳转和返回的开始
- 内联函数不能存在任何形式的循环语句,不能存在过多的条件判断语句
- 默认参数
- c++可以在函数声明时为参数提供一个默认值,当函数调用时没有指定这个参数的值,编译器会自动用默认值代替
- 一旦在一个函数调用中开始使用默认参数值,那么这个参数后的所有参数都必须使用默认值参数
- 函数占位参数
占位参数只有参数类型声明,没有参数名声明,一般情况下,在函数体内部无法使用占位参数 - 函数重载
- 概念
函数名相同,参数不同的函数称为函数重载 - 函数重载的判断标准
函数重载至少满足下面的一个条件:
参数个数不同、参数类型不同、参数顺序不同 - 函数返回值不是函数重载的判断标准
- 函数调用标准
- 函数重载的本质是相互独立的不同函数(静态链编)
- 概念
- 函数重载和函数指针结合
当使用重载函数名对函数指针进行赋值时,根据重载规则挑选与函数指针参数列表一致的候选者。严格匹配候选者的函数类型与函数指针的函数类型
下面的是笔者的微信公众号,欢迎关注,会持续更新c++、python、tensorflow、机器学习、深度学习等系列文章