一、引用的概念
1.引用可以看作一个已定义变量的别名,C++编译器在编译过程中使用常量指针作为引用的内部实现,因此引用所占的空间大小与指针相同。
2.引用的语法:Type& name = var; //等价 Type* const name = &val;
int a =10;
int& p =a;//p是a的引用
等价于C语言中
int a =10;
int* const p =&a;//p是只读的,指向不可改变
注意:
1.&不是地址运算,而是起标识作用
2.类型标识符是指目标变量(a)的类型(int)
3.必须在声明引用变量时进行初始化
int a =10;
int& p; //错误,必须初始化,如int& p =a;
4.引用初始化后不可改变
int a =10;
int& p =a;
int b=20;
&p = b;//错误 引用初始化后不可改变 没有这种写法
5.不能有NULL引用,必须确保引用是和一块合法的存储单元关联
二、引用的使用
void test()
{
int a =10;
//给变量a取个别名b
int& b=a;
cout<<a<<endl; //10
cout<<b<<endl; //10
//操作b就相当于操作a本身
b =100;
cout<<a<<endl; //100
cout<<b<<endl; //100
//一个变量可以有N个别名
int& c=a;
c=200;
cout<<a<<endl; //200
cout<<b<<endl; //200
cout<<c<<endl; //200
//a,b,c的地址都是相同的
cout<<&a<<endl;
cout<<&b<<endl;
cout<<&c<<endl;
}
三、引用作为函数的参数
普通引用在声明时必须用其他的变量进行初始化,引用作为函数声明时不进行初始化。
typedef struct Teacher
{
char name[32];
int age;
}Teacher;
void Prt(Teacher &t) //等价于void Prt(Teacher* const t)
{
cout<<t.age<<endl;
t.age = 32; //会改变值
}
int main() {
Teacher t;
t.age = 30;
Prt(t); //30
cout<<t.age<<endl; //32
return 0;
}
四、引用的意义
1.引用作为其他变量的别名而存在,因此在一些场合可以代替指针
2.引用相对于指针来说具有更好的可读性和使用性
int swap1(int& a,int& b)
{
int t=a;
a=b;
b=t;
return 0;
}
int swap2(int* a,int* b)
{
int t=*a;
*a=*b;
*b=t;
return 0;
}
int main() {
int a =10;
int b=20;
swap(a,b);
cout<<a<<','<<b<<endl; //20,10
swap2(&a,&b);
cout<<a<<','<<b<<endl; //10,20
return 0;
}
3.引用在函数形参为对象的引用以及函数返回值为对象的引用上使用非常广泛,需要结合后面学习的类和对象在补充。