真是用多了就知道一个东西的好处,跟指针比起来,C++引入的引用非常的方便,这一篇就来说一说引用。
简单的说,引用就是某个变量或对象的别名。建立引用时,要用某个变量名或对象名对它进行初始化。于是它便绑定在该变量或对象上。引用只作为某个变量或对象的别名来使用,对引用的改动就是对用来对它初始化的变量或对象的改动。引用不是变量或对象,它不占内存空间。引用只是替代某个变量或对象的别名。引用有值,它的值是被引用的变量的值,引用有类型,它的类型就是被引用的变量的类型。
建立引用的格式:<类型说明符> & <引用名> = <变量名或对象名> 符号&是说明符,它用在引用名前。它与运算符&不同,运算符&表示取地址值,作用在变量名前。符号&有三种使用方法: int& ra=a; int &ra=a; int & ra=a; 这三种都是等价的。
引用作为函数参数
引用作为函数参数可以达到指针作为函数参数的相同的目的:传递参数不拷贝副本,在被调用函数中改变调用函数参数值。但是,引用作为函数参数时,调用函数的可读性好。因为引用作为函数形参时,调用函数的实参用变量名或对象名,与一般传值调用相同。而指针作为函数形参时,调用函数的实参用地址值。
编程写入一个数输出这个数的数值,平方根和平方
<span style="font-size:18px;">#include <iostream>
#include <Cmath>//标准C++中数学函数库
using namespace std;
int fun(int,double &,double &);//函数的说明,其中两个形参是引用
int main()
{
int x,test;
cout<<"Enter a number(0--100): ";
cin>>x;
double square_root,square;
test=fun(x,square_root,square);//函数的调用,调用函数的实参用变量名
if(test)
cout<<"Enter error!\n";
else
{
cout<<"number="<<x<<endl;
cout<<"square_root="<<square_root<<endl;
cout<<"square="<<square<<endl;
}
return 0;
}
int fun(int x,double &rsquare_root,double &rsquare)//函数的定义,其中的两个形参是引用
{
if(x>100||x<0)
return 1;
rsquare_root=sqrt(x);
rsquare=x*x;
return 0;
}</span>
引用作为函数参数的返回值
一般函数返回值时都要建立临时变量,即用来拷贝副本。具体的实现是:先将返回表达式的值传递给临时变量,返回到主函数后,再将临时变量的值传递给接受函数返回值的变量。但是,返回引用时,并不产生副本,而是将其返回值直接传递给接收函数返回值的变量或对象。
编程求出一个数的平方
<span style="font-size:18px;">#include <iostream>
using namespace std;
int &square(int);//定义的一个返回引用的函数
int main()
{
int s1=square(15);//直接将其值传递给接受函数返回值的变量的调用函数
int s2=square(28);
cout<<"s1="<<s1<<"s2="<<s2<<endl;
return 0;
}
int t;//定义的外部变量
int &square(int i)
{
t=i*i;
return t;
} </span>
再来看一个综合的程序题:
#include <iostream>
using namespace std;
int& fun(const int &);//函数的说明,返回引用和形参是常引用
int main()
{
int x=10;
int y=fun(x);
cout<<"y="<<y<<endl;
x=20;
y=fun(x);
cout<<"y="<<y<<endl;
return 0;
}
int& fun(const int &a)//函数的定义
{
static int b=5;
b+=a;
cout<<"a="<<a<<endl;
return b;
}
这道程序题是用const限定引用保护实参不被修改。当一个函数的参数被设定为const类型时,它的值就被不允许修改,这时只通过返回值和其他方法进行函数间的数据传递。如果要修改,则程序将会发出报错信息。