c++中引用一经定义不能更改转而引用其他变量的理解

c++中对引用的定义和说明:

引用变量是一个别名,也就是说,它是某个已存在变量的另一个名字。一旦把引用初始化为某个变量,就可以使用该引用名称或变量名称来指向变量,对引用的操作与对变量直接操作完全一样。

定义格式为:类型 &引用变量名 = 已定义过的变量名。

引用的特点:

  ①一个变量可取多个别名。

  ②引用必须初始化,只有别名是不能成立的。(如果不初始化,编译器出错警告)

  ③引用只能在初始化的时候引用一次 ,不能更改为转而引用其他变量。

如下示例:

#include <iostream>
using namespace std;
int main()
{
    int a = 10;
    int& b = a;    // 给a起一个别名b
    int c = 70;
    b = c;        //别名重新指向C??,那么a的值应该还是10,b值和c值 为70 
    cout << "a="<<a << endl;
    cout << "b="<<b << endl;
    cout << "c=" << c << endl;
    system("pause");
    return 0;

}

程序可以运行,好像引用可以修改为其他的值引用。实际执行结果

 实际结果和想象中的并不一样,a并不是10,而是70。说明理解有问题,那么问题出在哪里?继续深究。

程序做如下变更:

#include <iostream>
using namespace std;
int main()
{
    int a = 10;
    int& b = a;    // 给a起一个别名b
    int c = 70;
    b = c;        //别名重新指向C,那么a的值应该还是10,b值和c值 为70 
    cout << "a="<<a << endl;
    cout << "b="<<b << endl;
    cout << "c=" << c << endl;
    cout << "*********" << endl;
    //假设b已经重新指向c,是c的别名,那么更改b的值,c应该同步改变
    b = 18;
    //更改后 再次输出,看结果
    cout << "a=" << a << endl;
    cout << "b=" << b << endl;
    cout << "c=" << c << endl;
    system("pause");
    return 0;

}

观察结果

结果是,a 值改变了,c值并没有改变,说明没有改变原来绑定的别名。 

程序中“b=c;”不能理解成:取消b是a的引用而将b作为c的引用。正确的理解应该是:利用引用b来改变它所指对象a的值,即相当于语句“b=70;”。

所谓的引用的重新赋值,应该是: 
int a,b,c; 
int &b=a; 
&b=c; 
这种是对引用b,改变了它的指定对象,一开始是a的引用,之后,又重新说明是c的引用,这种引用的重新赋值是不允许的 .编译无法通过。

常引用所引用的对象的值是不能更改的,即上述示例中若将语句“int& b=a;”更改为“const int& b=a;”,当出现“b=c ;”时出现编译时错误。

常引用一般用在函数参数中,最大的好处是可以传送地址提高效率,却不用担心变量被修改。
比如:int fun(const Obj &m)
如果不用const,则m可能被修改,如果不用引用,则对于结构类型的参数传递效率可能较低。

  • 11
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值