C++学习笔记_2_ C++入门(2)
前言
重点是引用
一、引用
引用概念
引用不是新定义一个变量,而是给已存在变量取了一个别名,编译器不会为引用变量开辟内存空间,它和它引用的变量共用同一块内存空间。
比如:诸葛亮,有人称为"孔明",有人称"卧龙",江湖上人称"诸葛村夫"。
如下:
int main()
{
int a = 10;
int& b = a;//这里的&是引用,不是取地址
a = 20;
b = 30;
return 0;
}
通过监视可以看出,b是a的别名,所以a、b的取值改变,地址也会改变,且二者拥有一个地址。
引用特性:
-
引用在定义时必须初始化。(权限可以缩小不能放大)
-
一个变量可以有多个引用,即多个别名。
-
一旦引用一个实体,不能再引用其他实体。
int main()
{
//指针和引用在初始化赋值时,权限可以缩小,不能放大
const int a = 10;
//int& b = a;
const int& b = a;
int c = 10;
const int& d = c;
const int& r = 10;
//整形和浮点数之间互相隐式类型转换
double dd = 2.22;
int i = dd;
const int& ri = dd;
return 0;
}
二、引用的作用
1.引用做参数
- 输出型参数
代码如下:
void Swap(int& x, int& y)//引用
{
int tmp = x;
x = y;
y = tmp;
}
void Swap(int* px, int* py)//指针
{
int tmp = *px;
*px = *py;
*py = tmp;
}
int main()
{
int a = 0, b = 1;
Swap(&a, &b);
Swap(a, b);
return 0;
}
通过监视,看出两次地址doum
2. 大对象引用传参可以提高效率
代码对比如下:
2.引用做返回值
代码如下:
int& Add(int a, int b)
{
int c = a + b;
return c;
}
int main()
{
int& ret = Add(1, 2);
cout << "Add(1, 2) = " << ret << endl;
return 0;
}
此时输出为:
对比如下代码:
int& Add(int a, int b)
{
int c = a + b;
return c;
}
int main()
{
int& ret = Add(1, 2);
Add(3, 4);
cout << "Add(1, 2) = " << ret << endl;
return 0;
}
结果如下:
结果不同的原因就在于在进行**Add(3, 4)操作的时候,所用的地址还是Add(1, 2)的,在进行完操作后,ret作为引用,ret的地址就是Add(3, 4)**的地址。所以结果为7.
三、指针和引用的区别
- 引用在定义时必须初始化,指针没有要求。
- 引用在初始化时引用一个实体后,就不能再引用其他实体,而指针可以在任何时候指向任何一个同类型实体。
- 没有NULL引用,但有NULL指针。
- 在sizeof中含义不同:引用结果为引用类型的大小,但指针始终是地址空间所占字节个数。(32位平台下占4个字节)
- 引用自加即引用的实体增加1,指针自加即指针向后偏移一个类型的大小。
- 有多级指针,但是没有多级引用。
- 访问实体方式不同,指针需要显式解引用,引用编译器自己处理。
- 引用相对安全。