引用不是新定义一个变量,而是给已经存在的变量取别名.
引用的特性:
1.必须初始化
2.一个变量可以多次引用(多个别名).
3.引用与原变量共享内存.(不能改变指向)
#include<iostream>
using namespace std;
int main()
{
int a = 0;(必须初始化)
int& b = a;//引用,给一个变量取别名,包括指针也可以取别名
int& c = a;
int& d = b;//也可以给别名起别名
++d;
//是相同的地址
cout << &a << endl;
cout << &b << endl;
cout << &c << endl;
cout << &d << endl;
return 0;
}
应用:在函数传参时,就可以用别名,可以不用指针了.
#include<iostream>
void swap(int& ra, int& rb)//就不用传地址了,没有空引用的概念了,风险更小
{
int temp = ra;//a和b的别名ra,rb.
ra = rb;
rb = temp;
}
int main()
{
int a = 0;
int b = 10;
std::cout << a << std::endl;
std::cout << b << std::endl;
swap(a, b);
std::cout << a << std::endl;
std::cout << b << std::endl;
return 0;
}
const引用:
引用的时候:权限只能缩小不可以放大.
//const引用
int main()
{
//引用的时候:权限只能缩小不可以放大
const int a = 10;//只能读和写
//int& b =a ;//权限放大error
const int& b = a;
int b = 20;//可读可写,还是可以引用的
const int& a = b;//权限缩小,只读和写
return 0;
}
指针和引用的关系:
1.语法概念上,引用是取别名不开空间,指针是储存一个变量地址,要开空间.
2.引用在定义时必须初始化,指针建议初始化,但是在语法上不是必须的
3.引用在初始化时引用一个对象后,就不能再引用其他对象;而指针可以不断的改变指向的对象.
4.引用可以直接访问指向对象,指针需要解引用才是访问指向对象.
5.sizeof的含义不同,引用与引用类型有关,但是指针就是4/8
6.指针很容易出现野指针,空指针的问题,引用很少出现,引用相对安全一些.
inline定义的内联函数:
与普通函数的区别:
1.调用方式不同
普通函数:调用时会产生函数调用开销(如保存寄存器、栈操作等),程序执行流程会跳转到函数体位置,执行完后再返回。
内联函数:编译器会将函数体直接插入到函数调用处,避免了函数调用的开销,相当于 "原地展开" 代码。
2.适用场景不同
普通函数:适合功能复杂、代码量大的逻辑,
或者需要被多次调用但每次调用成本较低的场景。
内联函数:适合简单、短小的函数
频繁调用时能显著提升性能,但代码量大会导致编译后可执行文件变大(代码膨胀)。
#include<iostream>
using namespace std;
inline int Add(int x, int y)//短小,简单
{
int ret = x + y;
return ret;
}
int main()
{
int ret = Add(1, 2);
cout << ret << endl;
return 0;
}