- 引用的定义:
又称之为别名,引用不是定义一个新的变量,而是给一个已经定义的变量重新起一个名字。即c++系统不为引用类型变量分配内存空间。
- 引用的格式:
类型 &引用变量名=已定义过的变量名;
#include<iostream>
using namespace std;
void main()
{
int a;
int &b=a;//b是a的引用,相当于别名,两者的内存地址是相同的
cout<<&a<<endl;
cout<<&b<<endl;
}
程序输出结果为:
- 引用的作用:
主要用于函数之间的数据传递
#include<iostream>
using namespace std;
void Swap1(int i,int j)//普通传值,会重新给i和j分配空间,但由于i和j的声明周期只在Swap1函数内,所以在内部交换两者的值,不会传递到主函数
{
int n=i;
i=j;
j=n;
}
void Swap2(int &i,int &j)//引用传值,i和j分别是a和b的引用,对i和j的修改某种意义上来说就是对a和b的修改,因为他们的内存空间地址相同。通过形参来修改实参的值
{
int n=i;
i=j;
j=n;
}
void main()
{
int a=3,b=4;
Swap1(a,b);
cout<<"a="<<a<<" "<<"b="<<b<<endl;
Swap2(a,b);
cout<<"a="<<a<<" "<<"b="<<b<<endl;
}
程序输出结果如下:第一次输出由于是值传递,所以a b的值不会改变,第二次是引用传递,两者的值发生了改变
在c语言中,要想通过形参修改实参的值我们可以通过传递实参的地址来实现
void Swap3(int *a,int *b)
{
int n=*a;
*a=*b;
*b=n;
}
void main()
{
int a=3,b=4;
Swap3(&a,&b);
cout<<"a="<<a<<" "<<"b="<<b<<endl;
}
//输出结果为a=4,b=3
- 引用作为返回值:
注意一下两点:
1.返回对象的作用域不受函数的影响
2.返回的生成作用域为该函数,则不能用引用返回
//*this为当前对象,它的作用域并不受函数的影响
Test& operator=(const Test &t)//赋值语句
{
if(this!=&t)
data=t.data;
return *this;
}
注意:不能定义空引用,例:int &p;
- 对指针的引用:
int a;
int *p=&a;
int *&pt=p;
- 对数组的引用:
int ar[]={1,2,3,4,5};
int (&br)[]=ar;//注意&br必须带括号
- 变量引用常量:
const int a;
int &b=a;//错误,不能变量引用常量。如果可以引用,那就意味着可以通过修改b的值来修改a的值,这与a是常量矛盾
- 变量引用常量
int a;
const int &b=a;//正确
- 常量引用常量
const int a;
const int &b=a;
- 不同类型之间的引用
int a;
const double &b=a;
类型不一样,就会产生临时变量,b真实引用的是临时变量,临时变量均为常量,所以b必须用const修饰