Fork me on GitHub

C++ primer plus读书感悟(三)引用

 引用

 1 #include <iostream>
 2 using namespace std;
 3 
 4 int main() {
 5     int a;
 6     int &b = a;
 7     a = 5;
 8     cout << "b=" << b;
 9     return 0;
10 }

1.引用形如

int a=5;

int &b=a;

2.引用的引入:变量是方便编程人员去编程的内存地址的别名,每一个变量其实都对应着一个内存地址,但是一个地址可以对应多个变量名。从如下可以看出:

/*程序3.1初识引用*/

 1 #include <iostream>
 2 using namespace std;
 3 
 4 int main() {
 5     int a;
 6     int &b = a;//必须在创建引用的时候进行初始化操作
 7     b = 5;
 8     cout << " b 的地址是: " << &b;
 9     cout << endl;
10     cout << " a 的地址是: " << &a;
11     return 0;
12 }

 程序运行的结果:为b,a所打出的地址是一样的,即变量a,b所对应的地址是一样的。

所以对其中的a,b任一变量名进行操作(如++)后,实际上是对a,b上所对应的地址上的值进行操作,所以在a,b两者的的值均变化。

 

引用其实接近于const指针也就是说:

int &b=a;

实际上是下列代码的伪装

int * const pb=a;

 

由于引用类似与const的伪装,所以在下列代码中我们可以很明确的看到将b变量的引用改为c变量的引用时会发生什么。

/*程序3.2对b的引用进行更改的结果*/

 1 #include <iostream>
 2 using namespace std;
 3 
 4 int main() {
 5     int b;
 6     int &a = b;
 7     b = 5;
 8     cout << " b 的地址是: " << &b << " b的值是 " << b;
 9     cout << endl;
10     cout << " a 的地址是: " << &a << " a的值是 " << a;
11     cout << endl;
12     int c = 10;
13     a = c;
14     cout << " c 的地址是: " << &c << " c的值是 " << c;
15     cout << endl;
16     cout << " a 的地址是: " << &a << " a的值是 " << a;
17     cout << endl;
18     return 0;
19 }

引用只能在创建的时候进行初始化,在创建后只可以对其地址所对应的值进行修改,但不可以对地址进行修改;

 

引用作为函数的参数:

 

最简单的 引用作为函数参数的样例

 

 /*程序3.3交换x,y值*/

 1 #include <iostream>
 2 using namespace std;
 3 
 4 void swap(int &m int &n);
 5 int main() {
 6     int x = 1;
 7     int y = -1;
 8     cout << "x= " << x << endl;
 9     cout << "y=" << y << endl;
10     swap(x, y);
11     cout << "x=" << x << endl;
12     cout << "y= " << y << endl;
13     return 0;
14 }
15 
16 void swap(int &m, int &n) {
17     int temp;
18     temp = m;
19     m = n;
20     n = temp;
21 }

如果将swap的定义替换成为下列的代码的话,函数将无法交换。

1 void swap(int m, int n) {
2     int temp;
3     temp = m;
4     m = n;
5     n = temp;
6 }

原因是引用是原地址值上进行修改,而上述代码是在内存中再申请两个位置将x,y上的值进行复制进去,并将这两个位置的值进行交换。并未影响在int main()中的x,y的值。(换而言之,就是上述代码是将下x,y的copy版本进行交换,并未影响x,y在内存中的存储的值)。

posted @ 2022-05-30 09:12  衔清风与共  阅读(95)  评论(0)    收藏  举报