引用变量注意事项——第八章(P226)
(1)引用变量必须在声明时就初始化。
例如:
int a; int a;
int &b; int & b=a; (正确)
b=a; (错误)
(2)引用作为函数参数。
a.引用最主要的作用就是作为函数参数使用,引用传递给函数的参数是实参的一个别名。是会影响实参的值的。
b.当调用一个有const引用的形参的函数时,如果实参不是一个变量(或者说实参没有一个确定的地址)或者类型不匹配时,那么函数会创建一个无名的临时变量用来存储实参的值,并把这个形参作为该临时变量的引用。这种转换只有在如下两种情况下才会发生:
第一:实参类型与形参匹配,但是不是左值(比如:字面常量12、多项表达式a+9……);
第二:实参类型与形参不匹配,但是可以转换成正确的类型。
例如:
#include<iostream>
using namespace std;
double refcube(const double & ra);
void main()
{
double side1=12.0;
int side2=6;
double c5=refcube(side2);//实参类型与形参不匹配,但是可以转换成正确的类型
cout<<c5<<endl;
double c6=refcube(7.0);//实参类型与形参匹配,但是不是左值
cout<<c6<<endl;
double c7=refcube(side1+10.0);//实参类型与形参匹配,但是不是左值
cout<<c7<<endl;
double c8=refcube(side2+4);//实参类型与形参不匹配,但是可以转换成正确的类型,而且不是左值
cout<<c8<<endl;
}
double refcube(const double & ra)
{ return ra*ra*ra;}
这段程序是能正确运行的。
注意:这种生成临时变量必须是要以const引用为前提的。如果函数为double refcube(double & ra);则该段程序将无法运行。
(3)引用作为函数返回类型:
如果函数的返回的类型为引用,则相当于函数返回函数体里return后变量的引用。
注意:如果函数的返回类型为引用,则必须返回一个在函数返回后不会销毁的变量:
例如:
#include<iostream>
using namespace std;
struct rect
{
double x;
double y;
};
struct rect & refcube(const struct rect & ra);
void main()
{
struct rect side={3.0,4.0};
struct rect c=refcube(side);
cout<<c.x<<endl<<c.y<<endl;
}
struct rect & refcube(const struct rect & ra)
{
struct rect temp;
temp.x=ra.x*2;
temp.y=ra.y*2;
return temp; 返回temp的引用,但是,当函数调用完毕时temp已经销毁。所以,不能运行。
}
此程序是不能运行的。
所以,可以返回一个作为作为参数传递给函数的引用。或者是返回一个用new来分配的变量。
注意:如果函数的返回类型也为const引用,并不表示被引用的变量是const,而只是意味着您不能使用返回的引用来直接修改它指向的变量。