文章目录
引用
定义
类型& 引用变量的名称 = 变量名称
在类型名和变量名之间的&,作用是引用
引用在语法来说,是不开辟空间
- 当定义成引用时,必须给予初始化
- 在定义引用时,不能有空引用
- 没有引用的引用
- 引用一旦初始化后,就不能再引用其他数据
int a= 10,b = 20;
int c = 0;
c = a&&b; //逻辑与
c = a & b; //按位与
int *p = &a; //取地址
int &x = a; //引用 x不开辟空间 x变了a也变了 x和a是同一块空间
int & fun() //函数返回类型为引用类型
{
}
void Swap(int &a, int &b) //引用
{
int tmp = a;
a = b;
a = tmp;
}
从右向左:
可以定义引用来指向指针
不可以定义指针去指向引用
int a = 10,b = 20;
int *p =&a;
int *s = p;
int *&pref = p; √
//给p取了个别名pref
int &*pref = p; ×
引用的本质
底层是一个指针
从语法上来看 引用是一个变量的别名
引用相当于一个自身为常性的指针
int& fun() //× 局部常量不能返回引用
{
int a = 10;
return a;
}
int * const fun()
{
int a = 10;
return &a;
}
什么样的变量可以以引用返回?
此变量的生存周期不受函数生存期的影响
1.static
2.全局变量
3.以引用为参数进 以引用为参数返回
指针,引用区别
- 定义和性质不同。指针是一种数据类型,用于保存地址类型的数据,而引用可以看成是变量的别名。指针定义格式为:数据类型 *;而引用的定义格式为:数据类型 &;
- 引用不可以为空,当被创建的时候必须初始化,而指针变量可以是空值,在任何时候初始化;
- 指针可以有多级,但引用只能是一级;
- 引用使用时无需解引用(*),指针需要解引用;
- 指针变量的值可以是 NULL,而引用的值不可以为 NULL;
- 指针的值在初始化后可以改变,即指向其它的存储单元,而引用在进行初始化后就不会再改变了;
- sizeof 引用得到的是所指向的变量(对象)的大小,而 sizeof 指针得到的是指针变量本身的大小;
- 指针作为函数参数传递时传递的是指针变量的值,而引用作为函数参数传递时传递的是实参本身,而不是拷贝副本;
- 指针和引用进行++运算意义不一样。
常引用:const和引用之间的关系
const int a = 10;
int &b = a; //错误
const int& b = a; //常引用 √
int &c = (int&)a;
c+=100;
可以能力收缩 但不能能力扩展
可读可写–>可读不可写 (能力收缩 可以)
不能通过修改s的值来改变a的值
int a =10;
const int &s = a; 能力收缩
s+=19; //错的
注意:
可读不可写–>可读可写 (能力扩展 不行)
int main()
{
const int a = 10; //常变量 不能被修改
int &b = a; //不允许编译通过的
} //程序有二义性
引用(Zhao)
-
引用的底层是一个指针
-
引用必须初始化
-
在使用到引用的地方,编译期会自动替换成指针的解引用
-
引用常量必须使用常引用
-
当引用一个不能取地址的量的时候,使用常引用
会生成一个临时量
引用临时量 临时量都有常属性
int fun()
{
return 10; //使用寄存器将数据返回
}
int main()
{
int &d = fun(); //❌ 修改为常引用
const int &d = fun();
}
Q:引用为什么必须初始化?
Q:引用为什么一旦初始化就无法改变引用的方向?
=> 在使用到引用的地方,编译期会自动替换成指针的解引用
const常量
const(Yang)
-
C语言 == > 常变量
不能作为左值(可修改) -
Const可以修饰返回值,如果返回值是值,则const无意义,如果返回值是指针,表示该指针不能被改动,只能把指针赋给const修饰的同类型的指针。
-
Const可以修饰成员方法,void fun()const{}代表在此函数中不允许对其数据成员做修改。在函数自己内部修改或者是调用普通成员方法修改数据成员都不可以!