最近学到了C++的引用,随手Mark一下
首先我们看个例子
class A{
public:
A():i(0){}
void f() {cout<< i <<endl;}
void increment(){i++;}
private:
int i;
}
int visit(A a);
int visit(A* a);
int visit(A& a);
有一个类A,创建了一个它的对象a,那么我们用visit用访问这个对象有三种方式。
第一种用函数visit(A a),这种方式非常耗费空间,因为它会在堆栈里面复制一个一模一样的a对象出来,所以当a对象太大时,一般不这么访问
第二种用函数visit(A* a),这种方式传对象的指针进去,效率很高,但是不是很美观,因为要经常用到&,*,->这些运算符
第三种是用也就是引用的方式,它就是创建一个变量的别名,例如A& b=a,那么b就是a的引用。对b操作就是对a操作。注意引用其实就是用指针实现的,只是它这种内存模型给我们提供的操作方式和指针有些区别。它的优势在于代码十分清爽,没有指针哪些繁琐的运算符。JAVA就是这么干的,它没有指针这些供我们使用。但是引用有个缺点,不直观。为什么这么说呢?当你调用visit(a)时,我们不能立马知道是用了变量复制还是引用,而指针visit(&a)就可以很直接明了的告诉我们用了指针。
另外,C++的引用的绑定关系不能改变,你如果把b作为a的引用,那就不能修改b作为其他变量的引用了。当然同一个变量可以有多个引用。例如int a=0;int& b=a;int& c =a;这样是可以的。