最近在看《c++语言的设计与演化》,对指针和引用有了全新的理解,决定写一篇博客记录一下。 指针很好理解,它本身拥有一个地址,地址中存着的是它指向的对象的地址。
int a = 3;
int* ptr = &a;
对于上面所定义变量a和指针ptr,ptr位于地址add1中,add1中存储的是a的地址。
引用是什么?简单的说,引用是别名,也就是其所指对象的第二名称,对引用的修改也就是对其引用对象的修改,从这意义上说,引用和指针很像(实际上对于很多编译器来说引用和指针的汇编是一样的!)。 那么为什么需要引入引用?或者说,引用和指针的区别有哪些? 我们知道,对于一个函数传参来说,一般来说有值传递和指针传递两种。
void func(T a);
void func(T* ptr);
对于简单的类型用值传递是可接受的,但当面对复杂的类型时值传递需要调用相关的构造函数等操作,这是不可接受的,因此一般使用指针传递。 一般来说这就已经够用了,但当c++引入了运算符重载后,指针传递就显现出它的弊病了。
T* operator+(T* a, T* b);
T a, b;
&a + &b;
a + b;
这就是引用传递所要解决的问题,让运算符的操作更符合我们的直观感觉。
T& operator+(T& a, T& b);
a+b;
另一个不同之处在于引用是一个初始化后就无法修改引用对象的特性,正由于该特性,c++中不存在这样的表述:
T& a;
T* b;
T t1, t2;
T& c = t1;
c = t2;
b = &t1;
b = &t2;
最后总结一下两者的异同: 相同点:两者都是用来实现对外部某块地址的控制。 不同点:指针可以修改其指向的地址(当不是const时),因此也可以不进行初始化,而引用必须进行初始化,且在初始化之后就不能变更其引用对象了。
|