C++引用的本质
引用为变量提供别名,最重要的用途之一是在给函数传递参数方面
注意:引用作为函数的形参时不需要初始化!
引用作为变量的别名而存在,因此有一些场合可以代替指针
引用相当于指针来说具有更好的可读性和使用性
swap.cpp
#include<stdio.h> int swap(int &a, int &b) { int temp; temp = b; b = a; a = temp; } int main(void) { int a = 1; int b = 2; swap(a, b); printf("a = %d b = %d \n", a, b); return 0; }
C语言的交换函数:
#include<stdio.h> int swap(int *a, int *b) { int temp = *a; *a = *b; *b = temp; } int main(void) { int a = 1; int b = 2; swap(&a, &b); printf("a = %d b = %d\n", a, b); return 0; }
、
特殊的引用
const引用
-在C++中可以声明const引用
-const TYPE& name = var;
-const引用让变量拥有只读属性
int a = 4; const &b = a; int *p = (int*)&b; b = 5; //error 只读变量 *p = 5; //ok
结论: 使用常量对const引用初始化后将生成一个只读变量!!
引用有自己的存储空间吗?
引用的实质是指针,旨在大部分情况下代替指针,
功能性:可以满足指针的多数需要使用指针的场合,
安全性:可以避开由于指针操作不当带来的内存错误
操作性:简单易用,又不失强大
注意:不可以返回一个局部变量的引用
引用的一些疑问:引用和指针的区别
从使用C++语言角度来看:
引用和指针没有任何关系;
引用是变量的新名字,操作引用就是操作对应的变量;
从C++编译器的角度来看:
为了支持新概念,引用;必须要有一个有效的解决方案;
在编译器内部,引用的实现是一个指针常量;
因此 “引用”在定义时必须初始化;
在工程项目开发中:
当进行C++编程时,直接站在使用的角度看待引用,与指针毫无关系;引用就是变量的别名;
当对C++代码进行分析调试时;一些特殊情况,可以考虑站在C++编译器的角度看待引用;
下面的代码有问题吗?
int a = 1;
int b = 2;
int *pc = new int(3);
int & array[] = {a, b, *pc};
答案:有问题,C++语言为了兼容c语言中数组的特性;数组是一片连续的,类型相同的内存空间; 而这里的数组引用,内存空间并不连续;所以,在C++中,引用数组不成立;
实例代码如下:
#include<stdio.h> int a = 1; struct SV { int& x; int& y; int& z; }; int main() { int b = 2; int* pc = new int(3); SV sv = {a, b, *pc}; int& array[] = {a, b, *pc}; //error: in array: continus address; // but reference array destories that; so,in C++ doesn't support reference array; printf("&sv.x = %p\n", &sv.x); printf("&sv.y = %p\n", &sv.y); printf("&sv.z = %p\n", &sv.z); delete pc; return 0; }