目录
一、引用:
1、定义:
2、特性:
3、引用的使用:
4、const引用:控制权限
const引用定义:
const引用可以接收3种对象:
1、正常对象:
2、临时对象:
3、const对象:
总结:
5、引用与指针的关系:
二、内联函数:
编辑 三、nullptr:
四、总结:
一、引用:
1、定义:
✨✨引⽤不是新定义⼀个变量,⽽是给已存在变量取了⼀个别名,编译器不会为引⽤变量开辟内存空间,它和它引⽤的变量共⽤同⼀块内存空间。⽐如:⽔壶传中李逵,宋江叫"铁⽜",江湖上⼈称"⿊旋⻛";林冲,外号豹⼦头✨✨
👉👉 类型& 引⽤别名 = 引⽤对象
✨✨引用的出现代替了指针,对引用进行修改,就相当于对本名(引用对象)进行修改
2、特性:
//在定义时要初始化
//一个变量可以有多个引用
//引用一旦引用一个实体,再不能引用其他实体
初始化,决定了别名,该别名就一直是a的别名
已经有了实体了,不会引用其他的实体
3、引用的使用:
1. 引⽤在实践中主要是于引⽤传参和引⽤做返回值中减少拷⻉提⾼效率和改变引⽤对象时同时改变被引⽤对象。
2.引⽤传参跟指针传参功能是类似的,引⽤传参相对更⽅便⼀些。
3. 引⽤和指针在实践中相辅相成,功能有重叠性,但是各有特点,互相不可替代。C++的引⽤跟其语⾔的引⽤(如Java)是有很⼤的区别的,除了⽤法,最⼤的点,C++引⽤定义后不能改变指向,Java的引⽤可以改变指向。
4.⼀些主要⽤C代码实现版本数据结构教材中,使⽤C++引⽤替代指针传参,⽬的是简化程序,避开复杂的指针
4、const引用:控制权限
先补充一点说明:✨临时对象
临时对象:编译器需要⼀个空间暂存表达式的求值结果时临时创建的⼀个未命名的对象,C++中把这个未命名对象叫做临时对象;
✨👉🤔临时对象也就是存放一些结果的变量,使用完后会销毁
C++规定:临时对象具有常性(只能读,不能改)
//表达式求值
// 1、a+b 表达式运算
// 2、int a = 1; double b = a;a转换成double型(隐式类型的转换)
//3、整形提升
//4、传值调用的返回值
//5、截断
//………………
const引用定义:
可以引⽤⼀个const对象,但是必须⽤const引⽤。const引⽤也可以引⽤普通对象,因为对象的访问权限在引⽤过程中可以缩⼩,但是不能放⼤!!!!权限小了,也就是不能进行修改了
👉总之:引用可以引用 权限比自己大的,但是不能引用 权限比自己小的,自己的权限必须和引用对象的权限相同,或者比引用对象小!!
const引用可以接收3种对象:
1、正常对象:
int main()
{
int a = 10;
const int& b = a;//权限缩小
return 0;
}
🧑🎓🧑🎓但是 b不能修改a的值因为此时b的权限缩小了《《只能读,不能修改
👉👉但是a可以进行修改
2、临时对象:
int main()
{
double a = 10;
const int& b = a;
//int& b = a;不可以
return 0;
}
🧑🎓🧑🎓临时对象具有常性,因为要发生隐式转换,对于常性,它的权限是只读不可改,那么我们就要一个只读不可改的引用即const引用
对于常量也可以使用引用,但是根据权限对应,需要使用const引用才行,当然也不能给常量进行修改
int main()
{
//int& a = 10;错误的引用,常量的权限是只读不可改
const int& a = 10;
return 0;
}
3、const对象:
int main()
{
const int a = 10;//具有了常属性
const int& b = a;
return 0;
}
🧑🎓🧑🎓对于const的对象进行引用时,必须用同等权限的引用,即const引用;
总结:
const引用就是改变了引用的控制权限权限,其权限满足如下表达式
5、引用与指针的关系:
🧑🎓🧑🎓 C++中指针和引⽤就像两个性格迥异的亲兄弟,指针是哥哥,引⽤是弟弟,在实践中他们相辅相成,功能有重叠性,但是各有⾃⼰的特点,互相不可替代
//语法概念上引⽤是⼀个变量的取别名不开空间,指针是存储⼀个变量地址,要开空间。
//• 引⽤在定义时必须初始化,指针建议初始化,但是语法上不是必须的。
//• 引⽤在初始化时引⽤⼀个对象后,就不能再引⽤其他对象;⽽指针可以在不断地改变指向对象。
//• 引⽤可以直接访问指向对象,指针需要解引⽤才是访问指向对象。
//• sizeof中含义不同,引⽤结果为引⽤类型的⼤⼩,但指针始终是地址空间所占字节个数(32位平台下占4个字节,64位下是8byte)
//• 指针很容易出现空指针和野指针的问题,引⽤很少出现,引⽤使⽤起来相对更安全⼀些
二、内联函数:
关键字:inline + 函数声明
🧑🎓🧑🎓inline修饰函数,编译时C++编译器会在调⽤的地⽅展开内联函数,这样调⽤内联函数就不需要建⽴栈帧了,就可以提⾼效率
🧑🎓🧑🎓inline对于编译器⽽⾔只是⼀个建议(我和你说一声,听不听,取决于你的想法,我无法左右你必须听我的),也就是说,你加了inline 编译器也可以 选择在调⽤的地⽅不展开,不同编译器关于inline什么情况展开各不相同,因为C++标准没有规定这个。✨✨inline适⽤于频繁调⽤的短⼩函数,对于递归函数,代码相对多⼀些的函数,加上inline也会被编译器忽略展开太多了,代码量会太大✨✨
✨✨C语⾔实现宏函数也会在预处理时替换展开,但是宏函数实现很复杂很容易出错的,且不⽅便调试,C++设计了inline⽬的就是替代C的宏函数
注意:inline不建议声明和定义分离到两个⽂件(分装),分离会导致链接错误。因为inline被展开,就没有函数地址,链接时会出现报错。
三、nullptr:
C++中NULL可能被定义为字⾯常量0,或者 C中被定义为⽆类型指针(void*)的常量。🧑🎓🧑🎓不论采取何种定义,在使⽤空值的指针时,都不可避免的会遇到⼀些⿇烦;
🧑🎓🧑🎓 C++11中引⼊nullptr,nullptr是⼀个特殊的关键字,nullptr是⼀种特殊类型的字⾯量,它可以转换成任意其他类型的指针类型。使⽤nullptr定义空指针可以避免类型转换的问题,因为nullptr只能被隐式地转换为指针类型,⽽不能被转换为整数类型。
🧑🎓🧑🎓C++不允许void*类型的数据给其他类型的指针,必须墙砖同类型;
void f1(int x)
{
cout << "f(int x)" << endl;
}
void f1(int* ptr)
{
cout << "f(int* ptr)" << endl;
}
int main()
{
f1(0);//
f1(NULL);//相当于传一个常数0
f1((int*)NULL);// f1((void*)NULL);将NULL强转为指针类型
f1(nullptr);//空指针
return 0;
}
nullptr相当于c语言中的NULL,但是不能转换成整形
四、总结:
继续努力!!