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在内存中的存储的值)。

浙公网安备 33010602011771号