【C++】C++入门基础:引用详解

这篇具有很好参考价值的文章主要介绍了【C++】C++入门基础:引用详解。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

本篇继续分享关于C++入门的相关知识,有关命名空间、缺省参数和函数重载的部分欢迎阅读我的上一篇文章【C++】C++入门基础详解(1)_王笃笃的博客-CSDN博客

继续我们的学习

引用

在C语言中我们接触过指针,很多人都或多或少为他感到头痛过,很多C语言的使用者包括创始人都觉得很难用,所以便创造出了引用。

1.引用的概念

引用不是定义一个新的变量,而是给已经存在的一个变量取了一个别名,编译器不会为引用变量开辟内存空间,它和它引用的变量共享同一块空间。

举个例子,就比如你叫李四,同学给你起了外号叫小四,你妈妈给你取的小名叫四四,这些名字都指的是李四,这么说应该不难理解;

上代码感受一下

int main()
{
	int a = 0;
	int& b = a;

	return 0;
}

可以看到我们创建出了一个整形a,使用&符号创建了b,这里的b就是a的别名,他们公用一段内存空间。

【C++】C++入门基础:引用详解,c++,开发语言

很明显&符号在类型和定义的变量中间会被当作引用符号,否则就是取地址,我们也可以看出a和b共用同一块空间;

当我们给a和b同时++运算时

【C++】C++入门基础:引用详解,c++,开发语言

 可以看到他们都参与了运算,因为他们本质上就是对同一个数据进行操作;

可以简单的使用在两数交换之中

【C++】C++入门基础:引用详解,c++,开发语言

 可以看到传值并不会真正的实现转换,但是我们用引用的方法传参

【C++】C++入门基础:引用详解,c++,开发语言

 文章来源地址https://www.toymoban.com/news/detail-685675.html

 可以看到两数交换成功了。

在这里里我们在函数中用引用定义参数意义是给实参取了别名,x的别名就是a,y的别名就是b,我们对a和b进行操作实际上就是对x和y进行操作。

还有一种用C语言实现链表的场景

typedef struct ListNode
{
	int val;
	struct ListNode* next;
}ListNode;

void Push_back(ListNode** pphead, int x)
{
	ListNode* newnode = (ListNode*)malloc(sizeof(ListNode) * sizeof(int));
	if (*pphead == NULL)
	{
		*pphead = newnode;
	}
	else
	{

	}
}
int main()
{
	ListNode* plist = NULL;
	Push_back(&plist, 1);
	Push_back(&plist, 2);
	Push_back(&plist, 3);
}

这里的重点是二级指针的使用,当时我在写二级指针的时候也是非常头疼,但是我我们现在学习了引用可以对上面的代码进行优化;

typedef struct ListNode
{
	int val;
	struct ListNode* next;
}ListNode;

void Push_back(ListNode*& phead, int x)
{
	ListNode* newnode = (ListNode*)malloc(sizeof(ListNode) * sizeof(int));
	if (phead == NULL)
	{
		phead = newnode;
	}
	else
	{

	}
}
int main()
{
	ListNode* plist = NULL;
	Push_back(plist, 1);
	Push_back(plist, 2);
	Push_back(plist, 3);
}

可以看到现在的phead就是plist的别名,也就是说操作phead就可以达到操作plist的目的,这样就不用再纠结二级指针的使用,同样可以达到二级指针的效果。

通过以上代码我们可以知道引用作为形参,其他函数传参时引用可以影响实参。

接下来是引用使用时需要注意的一些小细节;

2.引用的特性

使用引用的时候必须初始化

【C++】C++入门基础:引用详解,c++,开发语言

 不能说只取外号没有真正的名字,这样的用法是错误的;

同时一个变量可以被多次引用,也就是说一个人可以有很多个外号,也可以给外号取外号;

int main()
{
	int a = 0;
	int& b = a;
	int& c = a;
	int& d = a;
	int& e = d;

	return 0;
}

这些都是可行的,虽然有很多引用但是它的底层都是对a进行操作;

还需要注意的是引用一但引用了一个实体,就不能再引用其他实体,也就是说上面的b、c、d、e不能再当作别人的外号。

【C++】C++入门基础:引用详解,c++,开发语言

 

可以看到报错说e被多次初始化,这也是C++的引用和java的引用区别,C++的引用只能引用一个实体,java的引用是可以改变指向的,这样就导致C++不能脱离指针,Java可以脱离指针。

3.引用做返回值

在刚开始认识函数时我们接触过传值返回

【C++】C++入门基础:引用详解,c++,开发语言

需要注意的是这里返回值并不是n,而是n的值 

 同时也有一种用法,但是这种用法非常危险。

那就是函数传引用返回

int& Count()
{
	int n = 0;
	n++;
	return n;
}

int main()
{
	int ret = Count();
	cout << ret << endl;
	return 0;
}

为什么会这种用法会非常危险呢?

我们知道调用函数时会建立栈帧,函数内部的临时变量都会在调用函数结束时失效,在这里传引用返回就相当于给没有名字的空间起了别名,类似于野指针的后果,所以这种情况输出可能会有两种情况,一种是正常输出,一种会输出随机值

 【C++】C++入门基础:引用详解,c++,开发语言

可以看到在vs的平台下会输出1,但是下方的结果或有一个waring

 【C++】C++入门基础:引用详解,c++,开发语言

 我们再用一段代码来解释传引用返回的影响;

int& Add(int x, int y)
{
	int c = x + y;
	return c;
}

int main()
{
	int& ret = Add(1,2);
	Add(2, 3);
	cout << "Add(1,2) is" << ret << endl;
	return 0;
}

以下是运行结果

【C++】C++入门基础:引用详解,c++,开发语言

 这里的原因是先用1和2调用了Add函数,并且将此次调用函数所占用的空间取了别名叫做ret,此时Add函数除了作用域后里面的数值都会被销毁,而空间还会被留下来,此时再次用2和3去调用Add,那么此次调用就会使用Add的栈帧空间,就得到了如上结果。

形象的说就是你在某一家酒店开了房,走的时候发现有东西没拿上,所以重新回房间里拿了东西,希望大家可以理解。

所以分享了以上错误的使用方式可以得到一个结论:如果函数返回时,出了函数作用域,如果返回对象没有返还给系统,则可以使用引用返回;如果已经返还给系统,则必须使用传值返回。

传引用返回在有些场景下也有着便捷的作用;

当初在学习数据结构时使用C语言完成链表是非常繁琐的

这里简单使用链表找到第i个位置的数据和修改数据

struct SeqList
{
	int* a;
	int size;
	int capacity;
};
//找到第i个位置
int SLAt(SeqList* ps, int i)
{
	assert(i < ps->size);
	return ps->a[i];
}
//修改
int SLModify(SeqList* ps, int i,int x)
{
	assert(i < ps->size);
	ps->a[i]=x;

}

可以感觉到C语言的接口非常的繁琐;

下面是C++读或修改数据的接口

 

int& SLAt(SeqList* ps, int i)
{
	assert(i < ps->size);
	return ps->a[i];
}

可以看到非常非常简单,只需要在返回类型前加上引用符号即可完成读取和修改的操作,

当然也可也全部使用引用减少拷贝的时间消耗

int& SLAt(SeqList& ps, int i)
{
	assert(i < ps.size);
	return ps.a[i];
}

通过main函数来简单使用

【C++】C++入门基础:引用详解,c++,开发语言

 这样我们既可以完成读取【C++】C++入门基础:引用详解,c++,开发语言

也可以完成修改操作【C++】C++入门基础:引用详解,c++,开发语言

所以引用做返回值也有它合适的场景。

以上就是本片要分享的关于C++引用的使用,如果对你有所帮助还请三连支持,感谢您的阅读。

 

 

到了这里,关于【C++】C++入门基础:引用详解的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【C++】C++入门基础详解(1)

    本篇内容要分享的是C++的基础内容,C++的诞生简单的说就是为了填补C语言中的语法坑,同时对比C语言来说增添很多便捷的语法规则,使用起来比C语言便捷不少,但是学习难度也大大增强,不过难度是成线性增长,可以一步一步的深入学习。 目录 1.命名空间 1.1命名空间指定

    2024年02月12日
    浏览(25)
  • Go语言入门记录:从基础到变量、函数、控制语句、包引用、interface、panic、go协程、Channel、sync下的waitGroup和Once等

    程序入口文件的包名必须是main,但主程序文件所在文件夹名称不必须是 main ,即我们下图 hello_world.go 在 main 中,所以感觉 package main 写顺理成章,但是如果我们把 main 目录名称改成随便的名字如 filename 也是可以运行的,所以迷思就在于写在文件开头的那个 package main 和 java

    2024年02月11日
    浏览(24)
  • C++入门基础(万字详解!!!)

      C语言是结构化和模块化的语言,适合处理较小规模的程序。对于复杂的问题,规模较大的程序,需要高度的抽象和建模时,C语言则不合适。为了解决软件危机, 20世纪80年代, 计算机界提出了OOP(object oriented programming:面向对象)思想,支持面向对象的程序设计语言应运而

    2024年02月13日
    浏览(25)
  • C++语言基础——函数(详解)

    目录 函数是什么 函数的定义 主函数举例  空函数 函数的调用 语法格式 举例说明:计算x的n次方 递归 递归的主要点 递归的结构 条件 递归使用的场景 函数全名叫 计算机函数 ,它可以帮助你完成一些特定的程序。你可以把它简单理解成一把手枪。 手枪的作用: 完成几发子

    2024年01月21日
    浏览(45)
  • 自然语言处理基础详解入门

    自然语言是指人类社会约定俗成的,并且区别于人工语言(如计算机程序)的语言,,是自然而然的随着人类社会发展演变而来的语言,它是人类学习生活的重要工具。 自然语言处理(Natural Language Processing, NLP)是一门以计算机为工具,对书面或口头形式的语言 进行各种处理

    2024年02月16日
    浏览(36)
  • 【C++】入门基础知识详解(一)

    目录 一、C++ 二、命名空间   1、命名空间的定义   2、命名空间的使用 三、C++输入输出 四、缺省参数   1、缺省参数的概念   2、缺省参数的分类     2.1 全缺省参数     2.2 半缺省参数 我们在学习C++之前,我相信大家大多数都对C语言多多少少都有所了解,C语言的关键

    2024年02月12日
    浏览(43)
  • 【C++】入门基础知识详解(二)

    目录 一、内联函数 1、概念 2、特性 3、内联函数与宏的优缺点 二、auto(C++11)   1、auto 简介   2、auto的使用细则     2.1 auto与指针和引用结合起来使用     2.2 在同一行定义多个变量   3、auto不能推导的场景     3.1 auto 不能作为函数的参数     3.2 auto 不能直接用来声

    2024年02月11日
    浏览(26)
  • C++基础入门——语法详解篇(下)

    文章目录 一、缺省参数 1、1 缺省参数的概念 1、2 缺省参数的分类 1、2、1 全部缺省 1、2、2 半缺省参数 二、引用 2、1 引用的概念 2、2 引用特征 2、3 引用的使用场景 2、3、1 引用做参数  2、3、2 常引用 2、3、3 引用做返回值  2、4 引用总结 三、内联函数 3、1 内联函数的引出

    2023年04月24日
    浏览(24)
  • 【C++初阶】第一站:C++入门基础(上) -- 良心详解

    前言:         从这篇文章开始,将进入C++阶段的学习,此篇文章是c++的第一站的上半篇,讲述C++初阶的知识 目录 什么是C++ C++的发展史 C++(C++98) 命名空间 命名空间定义 命名空间使用 1.加命名空间名称及作用域限定符 2.使用using将命名空间中某个成员引入 3.使用using na

    2024年02月04日
    浏览(33)
  • C语言基础入门----(5)数组详解

    Tips:本文主要面向C语言初学者及新手,属于系列文章,笔者借此巩固自身同时也希望帮助更多新人更快的入门,如有不当或错误,欢迎指正。 目录 前言 一、数组的定义 1.1数组的概念         1.2数组的定义格式 1.3注意事项  1.4数组元素的访问 1.5数组的特点  1.6常见错误:

    2024年02月04日
    浏览(28)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包