专业的C++代码会用到大量的引用,在C++中引用是变量的别名,所有对引用的修改都会改变被引用变量的值,可以将引用当作隐私指针,这个指针没有取变量地址和解除引用的麻烦(也可以将引用当作是原始变量的别名)。
一. 引用变量
1.引用变量在创建的时候必须初始化
int a = 0; int &b = a; //work std::cout << "b:" << b << std::endl; //int &c = 0; //error
const int &c = 0; //work
值得注意的是:不能对创建引用直接“值传递”,除非这是一个const引用;
引用总是引用当初初始化的那个变量,一旦创建就无法修改变量,但是可以修改变量的值,比如:
int x = 1,y = 2; int &xRef = x,&yRef = y; std::cout << "X : " << xRef << std::endl; std::cout << "y : " << yRef << std::endl; //X : 1 //y : 2 xRef = &y; //error
为什么错误呢?
因为xRef是int&,而y得地址是一个指针。所以两者而无法赋值。
如果将一个引用赋值给另一个引用呢?
xRef = yRef; std::cout << "X : " << xRef << std::endl; std::cout << "y : " << yRef << std::endl;
结果是:
X : 2
y : 2
看出这里只是将y的值传递给xRef(也就是x),但是XRef还是x得引用。
2.指针的引用和指向引用的指针
int *a; int *&aRef = a; //指向int的指针的引用 aRef = new int; *aRef = 100; std::cout << "a :" << *a << std::endl; int b; int &bRef = b; int *p = &bRef; //指向b引用的地址 *p = 10; std::cout << "b :" << b << std::endl;
结果是:
a :100
b :10
3.引用参数
引用通常作为函数或则方法的参数。默认的参数传递机制是按值传递。
引用传递相对按值传递的优点有:
1.效率:复制较大的对象或则结构需要较长的时间,引用传递只是把指向对象或则结构的指针传递给函数。
2.正确性:并非所有的对象都支持按值传递,即使支持按值传递也不能像deep copy那样。
4.引用作为返回值
引用作为返回值的主要原因是提高效率,返回引用而不是返回整个对象这样可以避免被不必要的复制。
#include <iostream> /* run this program using the console pauser or add your own getch, system("pause") or input loop */ void swapValue(int a,int b) { int temp = a; a = b; b = temp; } void swapvalue(int &a,int &b) { int temp = a; a = b; b = temp; } int main(int argc, char** argv) { int a = 1,b = 2; int c = 3,d = 4; std::cout << "a : " << a << " " << "b :" << b << std::endl; std::cout << "c : " << c << " " << "d :" << d << std::endl; std::cout << "swapValue :" << std::endl; swapValue(a,b); std::cout << "a : " << a << " " << "b :" << b << std::endl; std::cout << "swapvalue :" << std::endl; swapvalue(c,d); std::cout << "c : " << c << " " << "d :" << d << std::endl; return 0; }
结果是:
a : 1 b :2
c : 3 d :4
swapValue :
a : 1 b :2
swapvalue :
c : 4 d :3