学习笔记之引用的使用

void ReadData(double dData)
{
    dData = 12;
}
main()
{
    double dData = 14;
    ReadData(dData);
}

、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、
void ReadData(double& dData)
{
    dData = 12;
}
main()
{
    double dData = 14;
    ReadData(dData);
}

当dData作为参数赋值给这两个不同的函数,我们就会发现引用在函数中的作用。将引用变量用作参数,函数将使用原始的数据,而不是其拷贝。如果采用第一种,实际就是对变量的拷贝,所以当函数结束的时候,这个拷贝的临时变量就被释放,不能达到对原有数据进行修改的目的。

引用看上去很像伪装表示的指针。实际上,引用还是不同于指针的。引用不同于其他的变量的赋值。引用必须在声明引用时将其初始化,而不能像指针等其他类型那样,先声明,在赋值。这一点,有点像常量指针,必须在创建时进行初始化,一旦与某个变量关联起来,就将一直效忠于它

int iNum;
int& irNum;
irNume = iNum; //No, you can't do this
、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、

int iNum = 101;
int* pt = &iNum;
int& irNum = *pt;
int iNumTemp = 50;
pt = &iNumTemp;
将irNum初始化为*pt使得irNum指向iNum。接下来将pt改为指向iNumTemp,并不能改变这样的事实,即irNum引用的是iNum。
、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、

引用用作函数参数
引用经常被用作函数参数,使得函数中的变量名成为调用程序中的变量的别名。这种传递参数的方法称为按引用传递。按引用传递允许被调用的函数能够访问调用函数中的变量。而C语言只能按值传递。按值传递导致被调用函数使用调用函数中的值的拷贝。不过可以采用按指针传递来弥补传值的不足。在上面的代码中已经说明了按引用传递和按传值传递的区别。

采用引用传参一个优点也是它的不足,就是会改变原来数据的值。例如:
double cube(double a)
{
    a *= a * a;
    return a;
}         

double refcube(double &ra)
{
    ra *= ra * ra;
    return ra;
}

main()
{
    double x = 3.0;
    cout << cube(x) << "= cube of" << x << endl;
    cout << refcube(x) << "= cube of" << x << endl;
    return 0;
}

输出结果:
27 = cube of 3;
27 = cube 0f 27;
在这个引用参数的函数中,由于引用了参数,导致修改了原来的数据。显然这不是我们所期望的。如果我们期望改函数使用传递给它的值,而又不会对原来数据进行修改,但又想使用引用,我们可以采取常量引用。对于上面的例子中,可以修改成如下:
double refcube (const double& ra);
这样做的好处是,当编译器发现代码修改了ra的值,将生成编译错误。对于写以上代码时,我们最好采用传值的方式。当数据比较大(如结构和类)时,采取引用倒不失为一种好的方法。

引用虽然带来了很多的好处和方面,但是引用传参有一定的限制,比如说,
对于传值:
double z = cube(x + 2.0); //ok
对于传引用:
z = refcube(x + 3.0); //error,can't be compile
如果ra是一个变量的别名,则实参应是变量。这里表达式x + 3.0不是变量。如果试图这样做,C++编译器中将提示,参数不能从“double”到“&double”类型的转化。
解决该问题的方法是:使用const参数引用,修改如下:
double refcube(const double &ra)
{
    //ra *= ra * ra;
    return ra * ra *ra;
}
这样再传表达式给常量引用参数,就不会有问题了。由此,我们可以理解由该问题引出的临时变量、引用参数和const之间的关系。
、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、

如果实参与引用参数不匹配,C++将生成临时变量。而前提条件是函数的引用参数必须设置为常量引用参数。
如果引用参数是const,则编译器将在下面两种情况下生成临时变量:
1、实参的类型是正确的,但不是左值
2、实参的类型是不正确的,但可以转换为正确的类型

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值