大橙子网站建设,新征程启航
为企业提供网站建设、域名注册、服务器等服务
- 👑专栏内容:C++学习笔记
- ⛪个人主页:子夜的星的主页
- 💕座右铭:日拱一卒,功不唐捐
作为一名ikun,我最喜欢的明星就是坤坤,但是坤坤又不只叫坤坤,因为他的成名之作《鸡你太美》,ikun们就经常亲切的叫他鸡哥。
这个过程中,鸡哥就是我们 ikun 给偶像坤坤起的外号。而C++
中也有这一功能可以给自己喜欢的变量起外号。下面让我们和坤坤一起,学习C++
的引用!
引用同样是C++
相对于C语言
的又一个扩充。引用可以看做是数据的一个别名,通过这个别名和原来的名字都能够找到这份数据。引用不是新定义一个变量,编译器不会为引用变量开辟内存空间,它和它引用的变量共用同一块内存空间。
直接看概念可能有点抽象,我们想一下偶像坤坤被起外号的过程,就能理解了。坤坤又被粉丝们戏称为鸡哥,这里鸡哥就是偶像坤坤的别名,代表的都是坤坤这个人。世界不会因为粉丝们给坤坤起了个别名叫鸡哥,就凭空创造出一个人叫鸡哥。
2、引用的声明声明方法如下:
类型 & 引用变量名(对象名) = 引用实体;
注意:这里的&
符号并不是C语言中的取地址的意思,在C++中&
又有引用的意思。
注意:引用类型必须和引用实体是同种类型的。
下面举个例子:
void ikun()
{string kunkun = "我是坤坤";
string& jige = kunkun; //给kunkun取个外号叫jige
printf("kunkun的地址:%p\n", &kunkun);
cout<< "kunkun的打印:"<< kunkun<< endl;
printf("jige的地址:%p\n", &jige);
cout<< "jige的打印:"<< jige<< endl;
}
int main()
{ikun();
return 0;
}
3、引用的特性
Ⅰ、 引用在定义时必须初始化下面本ikun以身试法,写一段没有初始化的引用:
void ikun()
{string kunkun = "我是坤坤";
string& jige;
cout<< "kunkun的打印:"<< kunkun<< endl;
cout<< "jige的打印:"<< jige<< endl;
}
Ⅱ、 一个变量可以有多个引用这个理解起来很简单。就像我的偶像坤坤。他在经典歌曲《鸡你太美》中被ikun们称为鸡哥,但是后来,有一拨人喜欢上了他在这个节目中的篮球表演,于是,有人又以蓝球哥称呼他。还有一批人,喜欢上了他的中分发型,于是另外一批人,以中分哥称呼他。
这里的鸡哥、中分哥、篮球哥都是坤坤的外号或者说是坤坤的别名。
C++里面的引用也是一样,你可以给你喜欢的变量取很多的别名。
下面我举个例子:
void ikun()
{string kunkun = "我是坤坤";
string& jige = kunkun;
string& zhongfen = kunkun;
string& lanqiu = kunkun;
printf("kunkun的地址 :%p\n", &kunkun);
printf("jige的地址 :%p\n", &jige);
printf("zhongfen的地址:%p\n", &zhongfen);
printf("lanqiu的地址 :%p\n", &lanqiu);
}
int main()
{ikun();
return 0;
}
Ⅲ、引用一旦引用一个实体,再不能引用其他实体这句话的意思是,我们给一个变量去了外号后,以后这个外号只属于这个变量了,其他变量不能使用这个外号。
就像在我们ikun的眼中,鸡哥就是坤坤的外号,其他人不允许使用鸡哥这个外号!
我们下面看这段代码,有个叫做丽丽的变量,也想和坤坤一样取个外号叫做鸡哥。
这当然不会被我们ikun允许,运行一下,看编译器如何暴打丽丽!
void ikun()
{string kunkun = "我是坤坤";
string lili = "我是丽丽";
string& jige = kunkun;
string& jige = lili;
cout<< jige<< endl;
}
int main()
{ikun();
return 0;
}
4、常引用如果在声明引用时用const
修饰,被声明的引用就是常引用。
非const的引用只能绑定到普通的对象,而不能绑定到常对象;常引用可以绑定到常对象。一个常引用绑定的无论是普通的对象还是常对象,通过该引用访问的对象只能当做常对象对待,该对象拥有常对象的性质。
错误方式:
void ikun()
{const int is_ikun = 1;
int& good = is_ikun;
}
正确方式:
void ikun()
{const int is_ikun = 1;
const int& good = is_ikun;
}
三、使用场景
1、做参数在定义或声明函数时,我们可以将函数的形参指定为引用的形式,这样在调用函数时就会将实参和形参绑定在一起,让它们都指代同一份数据。如此一来,如果在函数体中修改了形参的数据,那么实参的数据也会被修改,从而拥有“在函数内部影响函数外部数据”的效果。
其实很好理解,我们给坤坤起的外号叫鸡哥,现在我说,让鸡哥去打篮球。去的人自然就是坤坤,看似是让鸡哥去做,其实结果就是坤坤,对鸡哥的改变就是对坤坤的改变。
像下面这一,利用引用也可以完成“在函数内部影响函数外部数据”的效果。
void Swap(int& left, int& right)
{int temp = left;
left = right;
right = temp;
}
2、做返回值如下,一个做返回值的小例子:
int &ADD (int r)
{r += 10;
return r;
}
值得注意的是,引用做返回值看似很简单,但是里面有个小坑!!
那就是在将引用作为函数返回值时应该注意一个小问题,就是不能返回局部数据(例如局部变量、局部对象、局部数组等)的引用,因为当函数调用完成后局部数据就会被销毁,有可能在下次使用时数据就不存在了。所以,如果函数返回时,出了函数作用域,如果返回对象还在(还没还给系统),则可以使用
引用返回,如果已经还给系统了,则必须使用传值返回。
此时,一位悲催的程序员再次以身试法,帮助ikun
避坑:
int& Add(int a, int b)
{int c = a + b;
return c;
}
int main()
{int& ret = Add(1, 2);
Add(3, 4);
cout<< "Add(1, 2) is :"<< ret<< endl;
return 0;
}
四、引用和指针的区别在语法概念上引用就是一个别名,没有独立空间,和其引用实体共用同一块空间。
但是在底层实现上实际是有空间的,因为引用是按照指针方式来实现的。
分析下面的代码:
//引用
int main()
{int a = 10;
int& ra = a;
cout<<"&a = "<<&a<
//指针
int main()
{int a = 10;
int& ra = a;
ra = 20;
int* pa = &a;
*pa = 20;
return 0;
}
我们来看下引用和指针的汇编代码对比:
引用和指针的不同点:
📢📢📢📢📢📢
💗 你正在阅读 【子夜的星】 的 C++笔记
👍 阅读完毕,可以点点小手赞一下
🌻 发现错误,直接评论区中帮我指正吧
你是否还在寻找稳定的海外服务器提供商?创新互联www.cdcxhl.cn海外机房具备T级流量清洗系统配攻击溯源,准确流量调度确保服务器高可用性,企业级服务器适合批量采购,新人活动首月15元起,快前往官网查看详情吧