1.引用定义与语法
引用可以看作一个已经定义的变量的别名
引用的语法:Type& name = var
#include <iostream>
int main(int argc, char** argv) {
int a = 5;
int& b = a;
b = 5;
printf ("a = %d\n",a);
printf ("b = %d\n",b);
printf ("&a = %08x\n", &a);
printf ("&b = %08x\n", &b);
return 0;
}
打印结果 a=5, b=5, &a = 0x22fe54, &b=0x22fe54
由于b就是a的引用,b引用a,那么b就是a的别名,指代同一段内存空间。
注意:引用必须在声明时使用其他变量进行初始化。
引用作为函数参数的时候可以不进行初始化。
2.引用的意义
a.在一些场合代替指针
b.相对于指针具有更好的可读性
#include <iostream>
/* 交换函数 */
void swap(int &a, int &b)
{
int temp = b;
b = a;
a = temp;
}
int main(int argc, char** argv) {
int a = 5;
int b = 6;
swap (a, b);
printf ("a = %d\n",a);
printf ("b = %d\n",b);
return 0;
}
3.const的引用
a.const引用让变量拥有只读属性(只能通过指针访问地址来改变数值)
b.当使用const引用进行初始化时,将生成一个只读变量,会为该变量分配空间,并使用引用名作为这段空间的别名。
#include <iostream>
int main(int argc, char** argv) {
const int &b = 1;
int* p = (int*)&b;
//b = 6;
*p = 6;
printf ("b = %d\n",b );
return 0;
}
同样,只能通过指针来改变该变量的值,因此这是一个只读变量。
声明只读变量 const int &b = 1;
声明常量 const int b = 1;
c.引用在C++中的内部实现是一个常指针, 即
Type& Name <==> Type* const Name, 因此引用有自己的存储空间,和指针占用的空间大小相同。
int* const a = &b; <==> int& a = b;
#include <stdio.h>
struct TRef
{
char& r;
};
int main(int argc, char *argv[])
{
char c = 'c';
char& rc = c; /* char* const rc = c */
TRef ref = { c };
printf("sizeof(char&) = %d\n", sizeof(char&)); /* sizeof(*rc)==sizeof(c)==1 */
printf("sizeof(rc) = %d\n", sizeof(rc)); /* sizeof (*rc) == 1 */
printf("sizeof(TRef) = %d\n", sizeof(TRef)); /* sizeof(rc) == 4 */
printf("sizeof(ref.r) = %d\n", sizeof(ref.r)); /* 1 */
return 0;
}
4.函数返回值为引用时
a.返回栈变量
不能成为其他引用的初始值
不能作为左值使用
b.返回静态变量或全局变量
可以成为其他引用的初始值
可以作为左值使用
#include <iostream>
/* 返回静态局部变量 a */
int & f(void)
{
static int a = 0;
return a;
}
int& g(void )
{
int a = 0;
return a;
}
int main(int argc, char** argv) {
int a = g();
int &b = g(); /* b引用局部的a */
f() = 10;
printf ("a = %d\n", a);
printf ("b = %d\n", b);
printf ("f() = %d\n", f());
return 0;
}
int a = g(); /* 将局部变量a的值返回, a=0 */
int &b = g(); /* b引用局部的a,即b指向a处的4字节空间,但是函数调用完a出空间会被释放,b是随机数 */
f() = 10; /* f()返回a的引用,因此可以打印出10,即指向静态存储区的引用的4字节为10 */
因此 对于三目运算符
所有的可能返回都是变量,就会返回变量的引用,可以作为左值使用
可能返回有常量时,返回的是值
小结:
1.C++的引用可以看作变量的别名来使用
2.C++的常引用可以使一个变量拥有只读属性
3.C++的常引用可以使用常量初始化而得到一个只读变量
4.C++中引用的本质是一个常量指针