C++的引用和指针
C++的引用
C++使用了一种符合类型,叫引用变量。(符号&)跟C 和 C++的取地址符一样,作用有点类似,但不是取地址符号。引用是给一个变量或者对象取一个别名,但是编译器并不会给引用开辟空间。可以说引用和它引用的对象是同一块空间,在编译器的角度来说。
#include<iostream>
using namespace std;
int main()
{
int val = 8;
int& reference = val;
cout << "val = " << val << endl;
cout << "reference = " << reference << endl;
return 0;
}
可以发现val变量和它的引用变量reference的地址是一致的,reference被声名为int& 的类型,意思是指向int 变量的int& 的引用。
引用的作用有点类似指针,但引用并不是指针,虽然它看起来有点像。
#include<iostream>
using namespace std;
int main()
{
int val = 8;
int& reference = val;
cout << "val = " << val << endl;
cout << "reference = " << reference << endl;
int* p = &val;
cout << " *p = " << *p << endl;
(*p)++;
cout << "val = " << val << endl;
cout << "reference = " << reference << endl;
cout << " *p = " << *p << endl;
reference++;
cout << "val = " << val << endl;
cout << "reference = " << reference << endl;
cout << " *p = " << *p << endl;
return 0;
}
这里val变量和reference引用的地址跟指针p一样,所以说变量val++ 或者引用reference++ 还是(*p)++都会影响其他两个的结果。**但是引用声名的时候必须初始化。**且引用的类型要和被引用的类型一样。一个变量可以被多次引用,但是一个引用只能引用一个一个实体。
可以在引用前面加上const 来修饰,不让引用指向其他的实体。
int val = 8;
int& const reference = val;
但是这并不是引用的真正作用。这样的引用并没有什么作用,引用的真正作用是做函数的参数。
上面说了,引用的类型要和被引用的对象类型一致,但是如果要引用成不同的类型,引用可以用const来修饰。
要使用const修饰的两种情况:
1.实参和形参的类型一样,但是实参是一个常数,形参就要用const来修饰。
2.实参是一个变量名,但实参和形参类型不一样,传参的时候会参数一个临时的拷贝,临时的拷贝具有常性,这个时候形参就要加上const。
int a = 0;
const double& b = a;
因为在不同类型的引用,中间会产生一个临时变量,临时变量具有常性,如果用const修饰就可以引用了。
引用作为函数的参数
在C++中,引用可以在函数被用作参数做形参,当函数被调用的时候,实参的变量会在调用的时候会是这个实参的别名,叫做引用传递,用这种方法可以访问到调用这个函数的实参。除了这种传参方式,其他的函数有传参的行为都是形参拷贝实参的数据,这种引用传参有点类似于传地址,拷贝地址然后通过地址来访问空间。
#include<iostream>
using namespace std;
double ADD1(double x)
{
x += x;
return x;
}
double ADD2(double& rx)
{
rx += rx;
return rx;
}
int main()
{
double a = 8;
cout << ADD1(a) << " ";
cout << "ADD1 " << a << endl;
cout << ADD2(a) << " ";
cout << "ADD2 " << a << endl;
return 0;
}
可以发现ADD1传参是a的拷贝,使用a 出了函数ADD1的作用域,a的值还没有变。ADD2传参是a的引用,别名是rx,rx就是a这个变量,使用出了ADD2的作用域,因为rx的变化,使用a也会发生变化。
如果程序员只是想把值传过去不发生改变,而且还想使用引用传值,可以在函数形参加上const修饰,可以避免实参发生变化。
double ADD2(const double& rx);