引用
引用是给一个变量起别名
定义引用的一般格式:类型 &引用名=变量名;
int a=1; int &b=a;//b是a的别名,因此a和b是同一个单元(注意:定义引用时一定要初始化,指明该引用变量是谁的别名) int &b;//error
在实际应用中,引用一般用作参数传递与返回值
变量有名称有空间 引用不是变量 引用仅仅是变量的别名,引用没有自己独立的空间,要与他引用的变量共享空间
对引用所做的改变实际上是对它所引用的变量的改变
引用一经初始化,不能重新指向其他变量。
#include<iostream>
using namespace std;
int main()
{
int val=100;
int & refval=val;
refval=200;
cout<<"val="<<val<<endl;
int val2=500;
refval=val2;//不代表将refval引用至val2这个变量
//仅仅是代表将val2赋值给refval
cout<<"val="<<val<<endl;
return 0;
}
const引用
const引用是指向const对象的引用
const int ival=1024;
const int& refval=ival;//ok
int &ref2=ival;//error
const引用可以指向非const对象
double val3=3.14;//这两者的值是不一样的 中间有临时变量的转换
//int temp =val3;
//const int& ref4=temp;
const int& ref4=val3;
int& ref5=val3;//error 非const引用没有中间的变量
按引用传递
引用传递方式是在函数定义时在形参前面加上引用运算符"&"( swap(int &a,int &b) )
按值传递方式容易理解,但形参值得改变不能对实参产生影响
地址传递方式通过形参的改变使相应的实参改变,但程序容易产生错误且难以阅读
引用作为参数对形参的任何操作都能改变相应的实参的数据,又使函数调用显得方便、自然
#include<iostream>
using namespace std;
void swap(int& x,int& y)
{
int temp=x;
x=y;
y=temp;
}
int main()
{
int a=5;
int b=6;
swap(a,b);//在函数调用时,引用被初始化x=a,y=b
cout<<"a="<<a<<"b="<<b<<endl;
return 0;
}
引用作为返回值
引用的另一个作用是用于返回引用的函数
函数返回引用的一个主要目的是可以将函数放在赋值运算符的左边(注意:不能返回对局部变量的引用)
#include<iostream>
using namespace std;
int a[]={0,1,2,3,4};
int& index(int i)
{
return a[i];
}
int main()
{
index(3)=100;//引用作为函数返回值,是的函数可以放在赋值运算符左边
//函数返回引用,引用在函数返回的时候初始化
//index(3)在函数返回的时候被初始化为a[3]
//&index(3)=a[3];
cout<<"a[3]="<<a[3]<<endl;
return 0;
}
#include<iostream>//不能返回对局部变量的引用
using namespace std;
int& add(int a,int b)
{
int sum;
sum=a+b;
return sum;
}
int main()
{
int n=add(3,4);//n的变量的值实实在在存在
int& n2=add(5,6);//n2是引用,没有自己独立的空间
//n2的值依赖于它所引用的变量
//如果n2所引用的变量的生命期结束,也就是说n2是一个无效的引用
//那么n2的值将是不确定的
//cout<<"n2="<<n2<<endl;
cout<<"n="<<n<<endl;
cout<<"n2="<<n2<<endl;
return 0;
}
引用与指针的区别
引用访问一个变量是直接访问,而指针是间接访问
引用是一个变量的别名,本身不单独分配自己的内存空间,而指针有自己的内存空间(对于32位系统,指针是4个字节)
引用一经初始化不能再引用其他变量,而指针可以
c++推荐尽可能使用引用,不得已时使用指针。
值传递 实参要初始化形参要分配空间 将实参内容拷贝到形参
引用传递 实参初始化形参时不分配空间 (效率更高)引用使用同一地址空间
指针传递 本质值传递 实参初始化形参的时候也要分配空间,分配的是4字节的空间(32位系统)
指针指向一块内存,它的内容是所指内存的地址;而引用则是某块内存的别名