#include <iostream>
int main(int argc,char *argv[])
{
int intone=5;
int &rint=intone;
int inttwo=6;
rin t=inttwo;
std::cout<<"intone="<<intone<<std::endl;
std::cout<<"rint="<<rint<<std::endl;
rint=10;
std::cout<<"intone="<<intone<<std::endl;
std::cout<<"rint="<<rint<<std::endl;
std::cout<<"&intone="<<&intone<<std::endl;
std::cout<<"&rint="<<&rint<<std::endl;
}
引用的别名和初始化
引用是个别名
引用的初始化
引用作为目标的别名而使用,对引用的改动实际就是对目标的改动。
为了建立引用,先写上目标的类型,再加上引用运算符”&”,然后是引用的名字。
引用能引用任何合法变量名
int*a:
int*&P=a://表示int*的引用P初始化为a
int b=8;
P=&b://0k,P是a的别名,是一个指针
引用与指针有很大差别:
&只有在声明引用时是引用操作符,其他时候都是地址操作符
C++没有提供访问地址的办法。
若一个变量声明为T&,即引用时要用T的变量或对象,或能够转成T类型对象进行初始化。
const double&rr=1;
- 先做必要的类型转换
- 将结果至于临时变量
- 将临时变量的地址作为初始的值
不能进行引用
对void进行引用是不允许的。
void &a=3
不能建立引用的数组
int a[10];
int &ra[10]=a;
没有引用的指针和引用的引用
int a;
int& ra=a;
int& *p=&ra; //error企图定义一个引用的指针
引用不能用的类型来初始化
int &ri=NULL;
int &ri=int;
函数的指针与引用
#include <iostream>
using namespace std;
void swap(int &a,int &b)
{
int temp;
temp=a;
a=b;
b=temp;
}
int main()
{
int x=10,y=20;
swap(x,y);
cout<<"x="<<x<<endl;
cout<<"y="<<y<<endl;
}
如果把引用作为返回值,他也不能把局部变量的地址返回出来
#include <iostream>
int &test()
{
int temp=12;
return temp;
}
int main()
{
int &x=test();
std::cout<<"x="<<x<<std::endl;
}
- temp的生命周期仅局限于&test函数的},结果会被释放。
- 函数会报警告,但是最后的结果也可以显示12,因为系统内部产生一个临时变量,存储temp值。
- 用static int temp就不会出现警告。
引用存在问题
int a=5,b=6;
swap(a,b);//会不清楚到底是引用还是传参。
使用引用作为参数和返回值给函数的意义
函数只能返回一个值,
解决问题的方法是传递两个参数。
#include<iostream>
using namespace std;
double& fn(const double& pd) //const作为参数
{
static double ad=3;
ad+=pd;
cout<<"fn being called..the value is:"<<pd<<endl;
return ad;
}
int main()
{
double a=3.6;
double& pa=fn(a);
cout <<pa <<endl;
a=5.4;
pa = fn(a);
cout <<pa <<endl;
return 0;
}
//6.6 12