今天作为第二天,今天雀儿只介绍引用的基本用法和const的用法。至于后面的右值引用和左值引用,我们后面了慢慢来讲:
引用,作为c++的新型用法,它的本质实际上是给一个已经定义好的变量起一个别名,例如:
有一个变量叫做date,然后我给他一个引用叫做day,那么此时我们就可以理解成,day和date就是一个东西,并且可以通过修改其中一个值同时改变另一个值。
类型名& (自己起的)引用变量名 = 被引用的变量名
int main(){
int a=10;
int& b=a;
b=20;//此时a也会变成20
cout << a << b << endl;
cout << &a << &b;
}
这里如果我们输出a和b会发现,随着b的值的改变,a的值也随之改变。而当我们输出他们两个的地址时,会惊讶的发现,他们连地址都是一样的!!!
也就是说,当我们操作a或者b的时候,他们的值会随着一起改变。在c++中,我们在平时函数传参的时候,都使用引用操作而非c语言中的指针操作。
接下来,我们结合指针来讲讲引用和指针的区别在哪里,为什么c++传参推荐使用引用而不是指针,为什么说引用非常的好用,它到底好用在哪里?
作为一个c语言用户,首次接触引用可能会联想到指针:
int main(){
int a;
int& b=a;
int *p=&a;
}
如上图所示:b和*p都可以表示a,而表达式&b和p也都可以表达a的地址(&a),这里我们就会发现,引用的那个b本质上和a没有区别:
相当于我的名字叫雀儿,但我也可以叫power雀儿,这里雀儿是我本身的名字,而power作为我的小名(也就是引用),我有了两个名字,我还是我,只是拥有了两个名字。正如前面所说,这两个名字他们连地址都是一样的,所以当然不分彼此。你可以通过叫我的名字来让我做事情,也可以通过叫我的小名来让我做事情。所以这么一解释,你会发现,在c++里面,引用还是很单纯的。而指针呢?是用来储存地址,通过取址符来访问数据,相比之下就会显得有一点麻烦。
#include
using namespace std;
int main(){
int arr[2]={23,45};
int& num1=arr[0];
int& num2=arr[1];
exchange(num1,num2);
}
void exchange(int& a,int& b){
int c;
c=a;
a=b;
b=c;
}
这里如果是c语言,传参传的应该是指针。但这里我们发现,他是直接把(小名)引用传到函数之中去,通过对他小名的操作,来对对象本身进行操作。因为对小名操作实际上和对名字操作并无区别。
int swap(int *p,int *q);
int swap(int &p,int&q);
以上皆为相等
而它们的区别就在:引用在定义的时候必须把它初始化,因为引用必须要有一个对象他才能被定义出来,如果没有对象,引用是无法被定义出来的。但是指针可以先定义在赋值,因为可以存在空指针但不能出现空的引用!
所以,注意引用一定要初始化
而引用,更类似于const指针,它引用了一个变量,这辈子都是这个变量的引用,不能引用其他的变量,终其一生只能效忠于一个变量。
这里会发现,诶~不对,这答案为什么不对呢???
雀儿来告诉你:当把引用x传进去之后,在函数中改变了x的值,因为x是引用,所以当x的值变化之后,原来的数也会随着引用一起变化。所以这里会变成27的立方是27。
所以,我们并不想改变传进来的那个引用,所以加上const就可以防止传进来的引用在函数中不慎被修改而导致外民的值随着引用的改变而改变。
在引用传参的时候,由于形参和实参的别名,对于形参的修改是可以直接反映出实参,如果这个参数不能修改,就需要加上const。
这里我们小小做一个总结:一个普通的变量可以用普通的引用或者是const引用(也就是不能修改的引用)。但是一个const的常量,就只能用const引用来引用。
说一个非常棒的比喻,就是说,如果雀儿买了一本书,那么这个书就是归我所有,我要借给大家,当然我即可以告诉你你可以在书上随意标注,我也可以很抠门,不让你用笔做注释。 但是!如果这是雀儿从图书馆借来的,那么我自然没有任何权利来让你们在书上做批注,只能说接你们看看就好了。这么说,大家能懂了吧。
再说直白一点,引用只能是从小范围向大范围引用。不能说这本书我自己都是借来的,自己都没资格修改它,然后让你们去修改对吧,这就很不对了,对吧。
这里我们直接把值传出去,不需要去修改传参。这里就非常完美~对吧!!
一、使用const可以避免无意中修改掉了原来的值
二、使用const可以处理const实参和非const实参,否则只能接受非const实参。
三、使用const可以让函数使用临时变量。
1、从语法规则上来说指针变量是储存一个变量的地址,引用是一个实例的别名。
2、指针变量需要分配内存,但是引用不需要。
3、指针变量可以发生改变,可以储存不同的地址。引用再被定义的时候,就无法在改变了,只能是一个变量的引用,不能再去引用其他的变量。
4、指针可以使空指针,但是引用可不能用空引用哦~
每日金句:
世上哪有什么成功,那只是努力的另一个代名词罢了。
————雀儿