解析c++中的引用和const引用,以及了解指针和引用的区别

一.什么是引用?

引用不是定义一个新的变量,而是给一个已经定义的变量重新起一个别名。
定义的格式为:
类型 &引用变量名 = 已定义过的变量名;

举例如下:

为了证明引用不是定义一个新的变量,而是给一个已经定义的变量重新起一个别名,我们输出下述例子中a,b的地址,看看他们的地址是否相同呢
代码如下:

#include<iostream>
using namespace std;

int main()
{
    int a = 10;
    int &b = a;//b为a的别名
    cout << "a=" << a << endl;
    cout << "b=" << b << endl;
    cout << "a的地址为:" << &a << endl;
    cout << "b的地址为:" << &b << endl;
    return 0;
}

输出结果为:
这里写图片描述

由此可知,a、b的地址相同,所以b就是a的引用(别名)。

了解了引用的基本概念以后,我们来看看引用都有什么特点呢?

引用的特点:
(1). 一个变量可取多个别名
(2). 引用必须初始化
(3). 引用只能在初始化的时候引用一次,不能改变为再引⽤其他的变量。

二.const引用

const是一种关键字,起受保护,防止以外的变动的作用!可以修饰变量,参数,返回值,甚至函数体。const可以提高程序的健壮性。

接下来我们看几个关于const引用的例子吧!
(1)

int a = 4;
const int & b = a;
a = 5; // a改变b的值也会改变。
//b = 6;//错误,b的值已经是5了,所以我们不能给常量赋值

(2)

const int a = 1;
const int & b = a;
//int&c = a;//错误
const int & d6 = 5; 
// 常量具有常属性,必须要用常引用(在引用前加上const)

(3)

double d =3.14//int &n=d;错误

为什么(3)中的表达式是错误的呢,我们用一张图来说明。

这里写图片描述

如图所示,double类型的d赋给int类型的n时会发生隐式转换,产生一个_d的临时变量,而由于临时变量具有常属性,不能被修改。所以就会发生错误。由例子(2)可知,常属性用常引用即可正确,所以我们将代码做如下修改就是代码就是正确的啦!

   const int&n=d;

三、引用作为返回值时和引用作为参数

(1)引用作为参数时,让我们来看一个具体例子

#include<iostream>
using namespace std;

void Swap(int& a, int& b)//引用作为形参,形参就是引用的别名。
{
    int tmp = a;
    a = b;
    b = tmp;
}

int main()
{
    int a = 10;
    int b = 20;
    Swap(a, b);
    cout << "a=" << a << endl;
    cout << "b=" << b << endl;
    return 0;
}

这样做的好处是不用像指针传参时那样还要重新开辟空间,引用传参就方便多了。

当然了,如果你不希望函数内改变参数的值时,尽量使常引用传参。

(2)引用作为返回值时

引用作为返回值的时候要特别小心,我们来看一个例子

#include<iostream>
using namespace std;

int& Add(int a, int b)//引用作为返回值
{
    int ret= a + b;
    return ret;
}

int main()
{
    int a = 10;
    int b = 20;
    int c = 0;
    c=Add(a, b);
    cout << "c=" << c<< endl;

    return 0;
}

上述例子是不对的,我们通过学习栈帧的知识都明白了,函数返回时,它的内容被保存在eax寄存器中。

函数传值作为返回值时,是将它的值放在eax寄存器中。
函数传引用作为返回值时,是将它的地址放在eax寄存器中。值得我们注意的是,函数此时的函数返回值要是被销毁了,地址就不存在了。所以程序会出错。

正如上述例子一样,函数传引用返回时,ret是一个临时变量,它最终会被销毁。程序出错了。

因此我们用引用作为函数返回值时,要特别注意返回值是否被销毁,我们不能返回临时变量的引用。

如果返回对象出了当前函数的作用域依旧存在,则最好使用引用返回,因为这样更高效。

四、指针与引用的区别

(1).指针求大小的时候,在32位平台下是4,在64位平台下是8.
引用求大小的时候,它的大小是被引用的变量的大小
(2).引用只能定义时初始化一次,之后不能改变指向其它变量,而指针变量可以改变
(3).引用必须初始化,而指针可以为空
(4).指针可以自增(++)和自减(–)
(5).引用比指针更安全(不用判断是否为空指针)

注意:使用指针时一定要注意检查指针是否为空。指针所指的地址释放以后最好置0,否则可能存在野指针问题。

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值