引用(&)
1、 引用(&)是对象的别名,不是新定义一个变量,对引用的操作与对对象的直接操作完全相同。引用本身不是一种数据类型,不占内存,系统也不给引用分配存储单元,因此对引用求地址就是对目标变量求地址。
2、 引用声明的时候必须初始化,且必须以对象初始化(初始化是指明引用指向哪个对象的唯一方法)。
int ival = 1024;
Int & refVal = ival;
Int & refVal2; error
Int &refVal3 = 3; error //必须以对象初始化
3、 当引用初始化后,只要该引用存在,它就保持绑定到初始化时指向的对象,不能再指向其他对象。
4、 Const 引用是指向const对象的引用,非const引用只能绑定到与该引用同类型的对象。
Const 引用则可以绑定到不同但相关的类型的对象或绑定到右值。
5、 引用作为形参的优点:
关键:引用作为形参传递的地址,而普通参数是值传递。
优点:
(1)、作为引用的形参被修改的同时,也修改了对应的实参的值。而使用普通参数做形参时,对应的实参值不会被修改。
(2)、普通参数作形参时会对形参进行复制,而引用参数是对实参的直接操作,因此不会浪费额外的内存空间,有助于提高效率。
6、如果既要使用引用提高效率,又要保护传入参数在函数中不被改变,就要使用常引用。
Const int ival = 1024;
Const int &refVal = ival; ok
Int &ref2 = ival; error
补:const限定符修饰的对象因为是常量,所以一经定义便不可修改,所以定义时必须初始化。
7、使用指针作为函数的参数虽然也能达到与使用引用的效果,但是,在被调函数中同样要给形参分配存储单元,且需要重复使用"*指针变量名"的形式进行运算,这很容易产生错误且程序的阅读性较差;另一方面,在主调函数的调用点处,必须用变量的地址作为实参。而引用更容易使用,更清晰。
8、指针与引用的区别
1:引用是变量的一个别名,内部实现是只读指针
2:引用只能在初始化时被赋值,其他时候值不能被改变,指针的值可以在任何时候被改变
3:引用不能为NULL,指针可以为NULL
4:引用变量内存单元保存的是被引用变量的地址
5:“sizeof 引用" = 指向变量的大小 , "sizeof 指针"= 指针本身的大小
char *b = "helloworld";
char *c[10];
double *d;
int **e;
void (*pf)();
cout<<"char *b = /"helloworld/" "<<sizeof(b)<<endl;//指针指向字符串,值为4
cout<<"char *b "<<sizeof(*b)<<endl; //指针指向字符,值为1
cout<<"double *d "<<sizeof(d)<<endl;//指针,值为4
cout<<"double *d "<<sizeof(*d)<<endl;//指针指向浮点数,值为8
cout<<"int **e "<<sizeof(e)<<endl;//指针指向指针,值为4
cout<<"char *c[10] "<<sizeof(c)<<endl;//指针数组,值为40
cout<<"void (*pf)(); "<<sizeof(pf)<<endl;//函数指针,值为4
6:引用可以取地址操作,返回的是被引用变量本身所在的内存单元地址
7:引用使用在源代码级相当于普通的变量一样使用,做函数参数时,内部传递的实际是变量地址