1.引用的概念;
(1)是C++中新增加的概念
所以当引用在C编译器(如gcc编译器)中编译的时候,一般会出错
(2) 引用可以看作一个已定义变量的别名,切记引用不能单独定义。
(3) 引用的语法:Type& name = var
(4)当引用做函数参数的时候(引用作为函数参数声明时不进行初始化)
例题代码;
#include <iostream>
#include <windows.h>
using namespace std;
int main(void){
int a = 666;
float c = 10.0;
int &b = a;
float &d = c;
//不能直接定义没有指向的别名
int &e = a;
couut<<"a ="<< a<<","<<"b = " <<b<<endl;
b = 888;
couut<<"a ="<< a<<","<<"b = " <<b<<endl;
couut<<"a 的地址:"<< &a<<","<<"b 的地址:%p" <<&b<<endl;
system("pause");
return 0;
}
2.引用的作用:
(1)引用可以做函数参数
普通引用在声明时必须用其它的变量进行初始化,
引用作为函数参数声明时不进行初始化
例题代码:
#include <iostream>
#include <windows.h>
using namespace std;
void swap(int a, int b) {
int tmp = a;
a = b;
b = tmp;
}
//方式一, 使用指针
void swap1(int *a, int *b) {
int tmp = *a;
*a = *b;
*b = tmp;
}
//方式二, 使用引用
void swap2(int &a, int &b) {
//int &c; //不可以,因为引用不可单独存在
int tmp = a;
a = b;
b = tmp;
}
int main(void){
int x = 10, y = 100;
//swap1(&x, &y);
swap2(x, y);
cout<<"x ="<<x<<","<<"y ="<<y<<endl;
system("pause");
return 0;
}
3.引用的意义:
(1)引用作为其它变量的别名而存在,因此在一些场合可以代替指针
(2)引用相对于指针来说具有更好的可读性和实用性
例题代码:
int swap(int &a, int &b){
int t = a;
a = b;
b = t;
return 0;
}
int swap(int *a, int *b) {
int t = *a;
*a = *b;
*b = t;
return 0;
}
这两种代码从功能上是等同的,但引用却比指针更容易理解和使用
4.引用的本质
在使用引用的时候,你是否思考过下面这几个问题?
(1)对同一内存空间可以用引用取好几个名字吗?
(2)引用它有没有自己的空间?
(3)比如b 是 a 的别名(int &b = a;),那在运行的过程中 c++编译器后面做了什么工作?
例题讲解代码:
#include <iostream>
#include <windows.h>
using namespace std;
/*
int swap1(int &a, int &b){
int t = a;
a = b;
b = t;
return 0;
}
*/
int swap2(int * const _a, int *const _b){
int t = *_a;
*_a = *_b;
*_b = t;
return 0;
}
int main(void){
int x = 10;
int &y = x;
int z = 1000;
int w = 10000;
y = z; //y 是没有办法指向 z的,这里只不过是把z的值赋给y,改变了x的值
cout<<"x = "<<&x<<","<<"z ="<< &z<<","<<"w ="<< &w<<endl;
//int &b = a;
//b 是 a 的别名,请问 c++编译器后面做了什么工作?
//1. 请思考:对同一内存空间可以取好几个名字吗?
//int &c = a;
//int &d = a;
//cout<<"a:" <<a<<","<<"b:"<< b<<","<<"c:"<< c<<","<<"d:"<<d<<endl;
//这里打印出来的信息会是a,b,c,d的值都是相同的
//2. 引用有没有自己的空间
//上面当打印出来x,y,z,w的地址的时候,会发现每两个之间的距离(彼此相差的字节)是一样的,然后再把打印x,z,w的地址,发现x和z之间相差的字节比原来多了一倍的字节。因此说明引用也有自己的空间。
//结论: 引用可以定义多个,引用有自己的空间,那么,引用像什么?
//综上几点分析: 别名很像常指针
//int &b = a等价于int * const b = &a;
//swap1(z, w); 换成 swap2(&z, &w);
cout<<"z:"<<z<<"," <<"w:"<<w<<endl;
system("pause");
return 0;
}
本质:
1)引用在C++中的内部实现是一个常指针 Type& name 《===》Type* const name
2)C++编译器在编译过程中使用常指针作为引用的内部实现,因此引用所占用的空间大 小与指针相同。
3)从使用的角度,引用会让人误会其只是一个别名,没有自己的存储空间。这是C++ 为了实用性而做出的细节隐藏
void func(int &var){
var = 15;
}
//电脑上会私下里把上面的代码换成下面的代码来执行
void func(int *const var){
*var = 15;
}
结论:
当实参传给形参引用的时候,只不过是c++编译器帮我们程序员手工取了一个实参地 址,传给了形参引用(常量指针)