目录
引用:一个变量或对象的别名。
引用声明:引用运算符 “&”,一般形式 `
*数据类型 &变量1 = 变量2;*//变量1是2的别名,2是1的作为引用的目标对象
e.g. string &zhangsan = Mr.Luo;// 张三是罗老师的另一个名字
意义:同一内存空间的不同名称,对张三的所有操作都是对罗老师的操作。
建议:为提高可读性,分行声明引用、指针、变量。
引用和指针:都可以通过操作引用或指针,来操作所指向的对象。
区别:指针是个变量,可以在程序中改变指针所指向的目标;
int b,c;
int *a;
a=&b;
a=&c;
引用是某个对象声明,引用自身不占内存空间。
#include <iostream>
using namespace std;
int main()
{
int b=0,c=1;
int &a=b;
cout<<sizeof(a)<<endl;
cout<<sizeof(b)<<endl;
cout<<sizeof(int &)<<endl;
cout<<sizeof(long long int &)<<endl;
return 0;
}
//结果
4
4
4
8
&本身不占空间,sizeof(变量类型 &)即所指向的变量类型的大小
变量和对象:
变量:通过定义,编译器开辟的一段空间,并赋予名称(内存在代码中可视化的符号,如string zhangsan; 这个名字不占据空间,且空间中存储内容可以改变,只不过在声明的时候人为将二者联系了起来)
对象:内存中一段定义了类型的区域,直接指向内存空间,可以独立存在传参数时生成临时变量,不能可视化,空间存在
注意:引用必须指向开辟了的空间(变量或对象)
1)声明引用必须给引用赋初值,且引用不能再指向其他对象。
2)不能对void进行引用:void语法上作为一个类型,本质上不是数据类型。
3)不能对数组建立引用 :数组名是数组空间首地址,不是数据类型
e.g. int a[10]; int &ra= a;//error
int a[10];int &ra =a[0];//ok
4)没有空引用 int &r = NULL;//error
5)可以建立指针变量引用
int i=5;
int *p= &i; // 定义指针变量p,指向i
int * &t = p; // t 是指向整形变量的指针变量的引用,初始化为p.
指针应用:1)引用作函数参数传递
#include <iostream>
using namspace std;
void swap ( int &a, int &b )//与传指针效果相同,相比指针需要用取值运算符,可以直接进行值传递
{
int temp;
temp = a;
a = b;
b = temp;
}
void main( )
{
int i=3, j=5;
swap ( i, j );
cout<<i<<“,”<<j<<endl;
}
2)返回引用类型函数
#include <iostream>
using namespace std;
double temp1,temp2,temp3,temp4;
double& f1(double r)
{
temp1=r*r*3.14;
return temp1;
}
double &f2(double r)
{
temp2=r*r*3.14;
return temp2;
}
double f3(double r)
{
temp3=r*r*3.14;
return temp4;
}
double f4(double r)
{
temp2=r*r*3.14;
return temp4;
}
int main()
{
f1(5.0)++;
++f2(5.0);
//f3(5.0)++; //error
//++f4(5.0); //error
cout<<"temp1="<<temp1<<endl;
cout<<"temp2="<<temp2<<endl;
//cout<<"temp3="<<temp3<<endl;
//cout<<"temp4="<<temp4<<endl;
return 1;
}
//函数返回值时,将生成一个临时变量; 函数返回引用时,不可以返回对临时变量的引用,因为临时变量最终被释放掉,引用失去所指向的定义了数据类型的空间。
3)返回引用函数作为左值被调用:调用一个返回引用的函数得到左值,其他返回类型得到右值。