c++基础学习之如何区分引用和指针

C语言中只有指针,C++加入了引用,能够起到跟指针类似的作用,下面这篇文章主要给大家介绍了关于c++基础学习之区分引用和指针的相关资料,文中通过示例代码介绍的非常详细,需要的朋友可以参考下

前言

对于我刚学c++的时候,最令我头疼的是引用和指针,老是区分不了它们,那么今天笔者将我的学习到的笔记总结出来,让大家少走一些坑。

术语:什么是对象?(对象在下面将会一直提到)

    c++程序员们在很多场合都会使用对象这个名词,通常情况下,对象是指一块能存储数据并具有某种类型的内存空间。有些人仅在与类有关的场景下才使用“对象”这个词。在这里,即认为对象是具有某种数据类型的内存的空间

1.引用

1.1引用的概念

引用为对象起另外一个名字,通过声明符写成&d的形式来定义引用类型,其中d是声明的变量名。

 int i = 10; int& refi = i;//refi是i的另外一个名字 int& refi2;//报错:引用必须初始化

一个对象可以有多个引用,相当于给对象起多个名字。

 //refi,refi1,refi2与i绑定在一起 int& refi1 = i; int& refi2 = refi1;

定义引用时,程序把引用和它的初始值绑定在一起,而不是将初始值拷贝给引用。一旦引用无法重新绑定到另外一个对象,因此引用必须初始化。

定义引用后,对它进行所有的操作都是与之绑定的对象上进行的。

 refi = 100;//将100的值赋值给refi,即把值给i int j=refi;//与int j=i;是一样的

1.2引用的定义

允许在一条语句中定义多个引用,其中每个引用标识符都必须以符号&开头。

 int i = 10, int i1 = 10;//i和i1都是int型 int& r = i, int i1 = i;//r是引用,与i进行绑定,i1是int int i3 = i1, & r2 = i1;//i3是int,r2是引用,与i1绑定一起 int& r3 = i, & r4 = i;//r3和r4都是引用

除特殊情况下(下面会讲),引用需要与要绑定的对象严格匹配,而且引用只能绑定在对象上,不能与字面某个值或某个表达式的计算结果绑定在一起。

 int& refi = 10;//错误:引用类型的初始值必须是一个对象 int i = 10; double& d = i;//错误:引用的类型必须是int型

1.3引用与const

把引用绑定到const对象上,我们称之为对常量的引用,与普通引用不同的是,对常量引用不能被做修改它所绑定的值。

 const int i = 10; const int& r1 = i;//正确:引用及其对应的对象都是常量 const int& r2 = 200;//正确:引用及其对应的对象都是常量 r1 = 40;//错误:r1是常量的引用,不能修改 int& r2 = r1;//错误:r1是常量引用,只能读,r2是非常量引用,能读能修改

术语:c++程序员们经常把词组“对const的引用”简称“常量引用”。

在我们之前提到,引用的类型必须与其所引用的对象的类型一致,但是有两个例外,第一种是情况是初始化常量引用时允许用任意表达式作为初始值,只要该表达式的结果能转换为引用类型即可,第二种是,常量引用可以绑定非const对象可以绑定。

 int i = 42; const int& r1 = i;//正确:允许将const int&绑定到一个普通int对象上 const int& r2 = i * 2;//正确:r2是一个常量引用 int& r3 = i * 2;//错误:r3是一个普通的非常量引用

而且对于常量引用还有更神奇的地方是:

 double d1 = 1.111; const int& r3 = d1;

上面的代码是正确的,r3是一个常量int类型的&引用,按理说应该只能绑定int类型的常量引用,单d1是一个double类型的对象 ,但编译器为了确保让r3绑定一个int类型对象,编译器自动把上述代码转换为:

 const int tmp = d1;//由double生成一个int类型的临时量 const int& r3 = tmp;//让r3绑定这个临时量tmp

此处r3是绑定了临时量,而非d1对象,所谓的临时量对象就是当编译器需要一个空间来暂存表达式的求值结果时临时创建的一个未命名的对象。

对const引用可以引用非const对象:

 int i = 10; int& r1 = i; const int& r2 = i;//正确:const引用可以引用非const对象,但是不能通过r2修改i r1 = 20;//正确:r1为非const引用,可以修改 r2 = 30;//错误:r2为cosnt引用,不能对i进行修改

1.4引用的使用场景

1.做参数

 void Swap(int& left, int& right) { int temp = left; left = right; right = temp; } int main() { int a=0,b=10; swap(a,b); }

引用可以用来做参数,把对象传给函数时,则函数中的参数则绑定到对应的对象中,不会产生临时变量例如:left则则是a的引用,right则是b的引用。

 2.做返回值

 int& Count() { static int n = 0;//n存在静态区中 n++; return n; //返回对象是n的引用 } int& Add(int a, int b) { int c = a + b; return c; } int main() { //这是错误的:因为c出了函数作用域后则会被销毁,则c这块空间就不存在 //ret引用就无效。 int& ret=ADD(1,2); }

以上就是c++基础学习之如何区分引用和指针的详细内容,更多请关注0133技术站其它相关文章!

赞(0) 打赏
未经允许不得转载:0133技术站首页 » C语言