C++入门(2)引用

引用是已存在变量的别名,不占用额外内存。引用必须在定义时初始化且不可变,常引用可以绑定到常量。使用引用能提高效率,避免拷贝大对象。引用作为参数或返回值能直接操作原变量,比指针更安全。指针则可为空,有多种级别并需显式解引用。

1.什么是引用

定义:引用不是新定义一个变量,而是给已存在的变量取了一个别名,编译器不会为引用变量开辟内存空间,它和它引用的变量共用同一块内存空间。比如:李华又称“华子”,“小李”。

格式:类型&引用变量名(对象名)=引用实体

int main()
{
int a =100; \\定义变量名
int b = a;\\将a的值赋给变量
int& c = a;\\引用 将c作为a的别名 c11中成为左值引用
return 0;
}

注意:引用类型必须和引用实体是同种类型

2.引用特性

(1)引用在定义是必须初始化

int a=10;int b=20;

(2)一个变量可以有多个引用

int& ra=a;  int& rra=a; int& rrra=a;

(3)引用一旦引用一个实体,再不能引用其他实体

int& ra=a;  int& ra=b;(编译失败)

3.常引用

(1)对于常量来说,一般不能引用。如:

const int a=10;

int& ra=10;(error)(又称权限升级失败)

(2)可以引用的情况:

平级引用:const int a=10;

const int& ra=a;(ok)

权限降低引用:int a=10;

const int& ra=a;(ok)

(3)!临时变量具有长属性!

类型转换,并不会改变变量类型,中间都会产生一个临时变量!

 总结:

1.权限只能缩小,不能放大,放大就会报错。

2.权限放大和缩小只针对引用和指针。

3.临时变量具有常属性。

4.const引用具有非常强的接受度。

5.使用引用传参,函数内不改变参数,尽量使用const引用传参。

**********************************************************************

4.使用场景

(1)做参数

这里x和y是a和b的别名,x和a是同一个地址,y和b是同一个地址。

(2)做返回值

 

①如果不用引用做返回值,返回值只是一个临时拷贝的数据,所掉用的函数在运行完成之后 会进行销毁,在上述程序中打印ret的值是不确定的存在两种情况

1.如果Add函数结束,栈帧销毁,没有清理栈帧,那么ret的结果是侥幸正确的。

2.如果Add函数结束,栈帧销毁,清理栈帧,那么ret的结果是随机值。

②如果用引用做返回值,返回的是Add返回值的地址

因此如果需要对调用函数里的返回值进行修改的话。就会方便很多。如下:

5.传值、传引用效率比较

以值作为参数或者返回值类型,再传参和返回期间,函数不会直接传递实参或者将变量本身直接返回,而是传递实参或者返回变量的一份临时拷贝,因此用值作为参数或返回值类型,效率是非常低下的,尤其适当参数或者返回值类型十分庞大的时候,效率就更低。

6.引用和指针的不同点

(1)引用概念上定义一个变量的别名,指针存储一个变量地址。

(2)引用在定义时必须初始化,指针没有要求。

(3)引用在初始化引用一个实体后,就不能在引用其他实体,而指针可以再任何时候指向任何一个同一类型实体。

(4)没有NULL引用,但有NULL指针

(5)在sizeof中含含义不同:引用结果为引用类型的大小,但指针始终是地址空间所占字节个数。

(6)引用自加即引用的实体+1,指针自加即指针向后偏移一个类型的大小。

(7)有多级指针,但是没有多级引用。

(8)访问实体方式不同,指针需要显式解引用,引用编译器自己处理。

(9)引用比指针使用起来相对安全。

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值