- 引用只是c++语法塘,可以看作编译器自动完成取地址、解引用的常量指针
- 引用区别于指针的特性都是编译器约束完成的,一旦编译成汇编就和指针一样
由于引用只是指针包装了下,所以也存在风险,比如如下代码:
int *a = new int;
int &b = *a;
delete a;
b = 12; // 对已经释放的内存解引用
- 引用由编译器保证初始化,使用起来较为方便(如不用检查空指针等)
- 尽量用引用代替指针
- 引用没有顶层 const (引用本身不可变) 即int & const,因为引用本身就不可变,所以在加顶层 const 也没有意义;但是可以有底层 const ()即 const int&,这表示引用所引用的对象本身是常量
- 指针既有顶层const(int * const--指针本身不可变),也有底层const(const int *--指针所指向的对象不可变)
- 有指针引用--是引用,绑定到指针, 但是没有引用指针--这很显然,因为很多时候指针存在的意义就是间接改变对象的值。但是引用本身的值我们上面说过了是所引用对象的地址,但是引用不能更改所引用的对象,也就当然不能有引用指针了。
- 指针和引用的自增(++)和自减含义不同,指针是指针运算, 而引用是代表所指向的对象对象执行++或--
#include<iostream> using namespace std; int main() { int x = 5; int& r = x;//reference必须在声明时就有初始化,否则Error //reference r可以说是 x的代表,也就是说字节和value都和x一模一样。 //即使reference在本质上是使用pointer来实现的,当我们改变r的值时,x的值也会变化。 int* p = &x; int x2 = 23; r = x2; //cout:r:23,x:23,表明reference不再可以指向其他物体.可以说reference是一种代表. //64位机器下: cout<<"size(x):"<<sizeof(x)<<" "<<"value:"<<x<<endl; //size(x):4 value:5 cout<<"size(r):"<<sizeof(r)<<" "<<"value:"<<r<<endl; //size(r):4 value:5 cout<<"size(p):"<<sizeof(p)<<" "<<"value:"<<*p<<endl;//size(p):8 value:5 //address对比:三者地址一模一样的 ,但是reference本质上是一种漂亮的指针,只是被刻意设计成和它所代表的变量一模一样。 cout<<"p的地址:"<<p<<endl; //p的地址:0x70fdf8 cout<<"r的地址:" <<&r<<endl;//r的地址:0x70fdf8 cout<<"x的地址:"<<&x <<endl;//x的地址:0x70fdf8 cout<<"r="<<r<<" "<<"x="<<x<<endl;//r=23,x=23; r--; cout<<"r="<<r<<" "<<"x="<<x<<endl;//r=22,x=22; return 0; }
总结:尽量用reference,特别是在传参的时候,传reference比较快。
05-16
211
“相关推荐”对你有帮助么?
-
非常没帮助
-
没帮助
-
一般
-
有帮助
-
非常有帮助
提交