引用是C++对C的一个重要扩充。
1、引用的概念:变量的引用就是变量的别名。引用不是新定义一个变量,而是给已存在变量取了一个别名,编译器不会为引用变量开辟内存空间,它和它引用的变量共用同一块内存空间。
从上面图中就可以看出,b是a的别名,b和a共用同一个空间,并没有为b开辟新的空间。
2、对引用的简单使用:
#include
using namespace std;
int main()
{
int a = 10;
int& b = a;
a = a * a;
cout << a <<" " << b << endl;
b = b / 5;
cout << a <<" " << b << endl;
}
分析:因为a与b共用同一块内存空间,所以当a变化时b也变化,当b变化时a也变化。
3、对引用的说明:
a、声明引用时必须指定它代表的是哪个变量,即对它初始化。
b、引用与其所代表的变量共享同一内存单元,系统并不为引用另外分配存储单元。
c、当&a前面有类型符如 int &a,它必然是对引用的声明。如果前面没有类型符如p=&a,此时的&时取地址运算符。
d、对引用的初始化可以是一个变量名,也可以是另一个引用。
int main()
{
int a = 3;
int& b = a;
int& c = b;
}
e、引用在初始化后不能再重新声明为另一个变量的别名。
4、将引用作为函数的参数:C++之所以增加引用,主要还是利用它作为函数的参数。
在C语言中,函数的参数传递主要是以下面两这种方式:
方式一:将变量名传给形参,传给形参是变量的值。如下边代码:此时的a、b都是作为入参,将a与b相加的结果通过函数的返回值返回。
#include
int Add(int a, int b)
{
return a + b;
}
int main()
{
int a = 10;
int b = 20;
int res = Add(a, b);
printf("%d\n", res);
}
方式二: 不通过函数的返回值返回,通过函数的参数返回,此时参数就要用指针的方式对其结果返回,这个参数就是出参。如下面代码:
#include
void Add(int a, int b,int *returnRes)
{
*returnRes=a + b;
}
int main()
{
int a = 10;
int b = 20;
int res;
Add(a, b, &res);
printf("%d\n", res);
}
在第一种方式中我们通过返回a+b的结果给到res 因此我们会开辟一个无名的临时空间给res;
第二种方法中我们要给指针开辟空间,存放res的地址。这两种方式都要开辟一定的空间,程序效率不高,所以在C++中我们更倾向于用引用作为函数的参数。
#include
using namespace std;
void Add(int a, int b,int &returnRes)
{
returnRes=a + b;
}
int main()
{
int a = 10;
int b = 20;
int res;
Add(a, b, res);
printf("%d\n", res);
}
在上面这个代码中是将引用作为函数的参数,returnRes时res的别名,没有为returnRes开辟新的空间,因此对returnRes进行 *** 作就是对res直接 *** 作,提高程序的效率。
5、对于引用的进一步说明:
a、不能建立void类型的引用。
void &a=9 //错误
b、不能建立引用的数组。
char a[2]={1,2};
char &b[2]=a //错误
数组名a只能能代表数组首元素的地址,本身并不是一个占有存储空间的值。
c、可以将变量引用的地址赋给一个指针,此时指针指向原来的变量。
int a=3;
int &b=a;
int *p=&b;//指针p指向变量a的引用b,相当于指向变量a
d、可以建立指针变量的引用。
int a=3;
int *p=&a;
int * &pt=p;//pt 是 p的别名,pt指向a
e、可以用const 对引用加一限定,不允许改变该引用的值。也称为常引用。
int a=3;
const int &b=a;//不允许改变该引用的值
此时如果你想改变a的值就是错误的。常引用通常用作为函数的形参,因为有时希望保护形参的值不被改变。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)