引用与指针小结
1、引用在创建的时候就必须被初始化, 即引用到一个对象; 指针在定义的时候不必初始化, 可以在之后根据自己的需要初始化。
2、没有空引用, 指针可以赋值为NULL, 而引用是不可以的,引用必须与合法的存储单元关联。
3、引用一旦被初始化指向(绑定)某个对象后, 它就不可以再被改变指向另一个对象。 而指针在没有经过const修饰的时候, 是可以随时指向另一个对象的。
int a = 0;
int b = 2;
int& c = a; //创建引用 c, 指向 a
c = b; //这时候 c 还是指向 a, 只是 a 的值是 2。 这句等同于 a = b;
如果是指针的话:
int a = 0; //假定 a 的地址为 0x4ea532
int b = 2; //假定 b 的地址为 0x4ea552
int* c = &a; //c 指向变量a *c 的值为0
*c = b; //c 指向变量a *c 的值为2
a = 9;
c = &b; //c 指向变量 b, a 的值为9, b 的值为 2
引用与指针在语言层面属于不同的两个东西。某种程度上来说, 对他们进行比较并没有什么意义, 如果一定要作比较的话, 还可以从下面的几个方面进行阐述。
4、指针可以进行算术运算(指向的内存地址的偏移操作), 引用的算术运算, 取决于指向对象所属类的算术运算定义, 如果该对象所属类没有定义相关操作就无法完成。
5、存在多级指针, 不存在多级引用, 对多次定义、 赋值只是为原对象创建了多个别名。
6、用sizeof运算符对指针进行求大小得到的是指针本身的大小(32位编译器四字节、 64位编译器8字节), 而引用得到的是对象大小
值得注意的是: 引用的创建和销毁并不会调用类的拷贝构造和析构函数, 这点和指针是一样的。
引用的主要价值是用来修饰函数的形参和返回值。
在C++中, 函数的参数和返回值的传递方式有三种: 值传递(会调用类的拷贝构造)、 指针传递(不会调用拷贝构造)及引用传递(不会调用类的拷贝构造)。 引用的好处在于, 既有指针传递的效率, 也有变量使用的方便和直观。