用法上的基本区别(包括sizeof和typeid)就不多说了,相信大家都了然于心,不清楚随便google一下也有一大堆。
下面从对象模型的角度去深入的谈谈指针和引用的区别,亦我们有了指针,为什么还要用引用。
1) 形式
这里所说的形式指的是运算符重载时的形式一致,事实上,在c++中,只有运算符有形式上确定的规定,因此,在重载[]运算符时,为了保持形式的一致性,就必须使用引用。
2) 临时变量
可以用const A&来引用一个临时变量(这同时证明了临时变量是有地址的,只不过该地址不能通过&取得),这保证了可以用临时变量来进行赋值。任何指针都不能指向临时变量,因为不恩不能通过&取得临时变量的地址。
3) 运算符重载
*运算符可以重载(可以重载就可以被禁用),而引用不可以重载,即不能被禁用。
以type_info类为例,
当一个类的构造函数被禁用后,就不能进行一般的变量初始化,type_info类构造函数被禁用
因此,(const)type_info t=typeid(a);是不合法的,会发生编译错误。
但是,我们知道一个类的指针变量是不调用构造函数就可以产生的,所以
理论上,(const)type_info *t=&typeid(a);是合法的,前提是*可用,一旦通过运算符重载禁用*(不可重载&),则这种方法也是不可以的。
此时,我们只能通过引用来捕获该变量。
(const )type_info &t=typeid(a);
事实上const A& t=typeid(a)这句是始终成立而不可以被禁用的,任何一个非抽象类的const引用变量都是可以捕获的,对于一些特殊设计的功能类,我们不希望对他进行修改、赋值等复杂运算,就可以将其设计成只有const A&变量的类。
引用与原值的区别(一重性):
引用的地址是const A*类,而原值的地址是A*类型。
值当然可以被引用,但是引用只能被const引用引用。
::上述两点保证了引用的一重性,引用的指针或者引用都不能再修改原值了。
深入理解指针和引用的区别及引用与原值的区别