2025年c++单向链表(c++单向链表冒泡)

c++单向链表(c++单向链表冒泡)特性 1 引 在定义时必须初始化 2 个变量可以有多个引 3 引 旦引 个实体 再不能引 其他实体 1 2 3 比如在删除链表某个结点 2 号结点 时 1 号结点的指针域指向 3 号结点 如果用引用 1 号结点的指针域就只能指向 2 号结点了 那不是就乱套了吗 应用

大家好,我是讯享网,很高兴认识大家。



特性:1 引⽤在定义时必须初始化 2 ⼀个变量可以有多个引⽤ 3 引⽤⼀旦引⽤⼀个实体,再不能引⽤其他实体


讯享网

                       1                                      2                                         3

比如在删除链表某个结点(2号结点)时,1号结点的指针域指向3号结点,如果用引用1号结点的指针域就只能指向2号结点了,那不是就乱套了吗? 

应用:

1.引⽤在实践中主要是于引⽤传参和引⽤做返回值中减少拷⻉(没有开空间)提⾼效率和改变引⽤对象时同时改变被引⽤对象

2.引⽤传参跟指针传参功能是类似的,引⽤传参相对更⽅便⼀些

3.引⽤返回值的场景相对⽐较复杂,我们在这⾥简单讲了⼀下场景,还有⼀些内容后续类和对象章节 中会继续深⼊讲解

1.2.

 
  
讯享网

3.

讯享网

如果我想修改栈顶的数据呢?

c++中传值传参会形成拷贝,传值返回也会形成拷贝,在函数进行传值返回返回这个对象时,他不会引用这个对象去作为函数调用的返回值,而会生成一个临时对象,将返回值传给一个临时对象,再用临时对象作为表达式的返回值。

在这里+1加的是临时对象上面,临时对象具有常性,如果想解决就要用引用返回(int&)

传值返回就是返回他自己的拷贝传引用返回是返回他的别名,跨过了临时对象这一步,那么就可以修改了。

int&r=rs.a[rs.top-1];    r++后, r又是rs.a[rs.top-1]的别名。

同时也可以用指针进行返回,切记不要放回栈空间的地址!这里数组空间在堆。

 

并不是所有都可以引用返回,野指针。

讯享网

能否用引用返回,就看函数结束时返回值的空间还在不在,在,就可以用引用返回,不在,就不能用引用返回。(有风险)后面类和对象再深入理解。 

4.引⽤和指针在实践中相辅相成,功能有重叠性,但是各有特点,互相不可替代。C++的引⽤跟其他 语⾔的引⽤(如Java)是有很⼤的区别的,除了⽤法,最⼤的点,C++引⽤定义后不能改变指向, Java的引⽤可以改变指向。

5.⼀些主要⽤C代码实现版本数据结构教材中,使⽤C++引⽤替代指针传参,⽬的是简化程序,避开 复杂的指针,但是很多同学没学过引⽤,导致⼀头雾⽔

const引用:

可以引⽤⼀个const对象,但是必须⽤const引⽤。const引⽤也可以引⽤普通对象,因为对象的访 问权限在引⽤过程中可以缩⼩,但是不能放⼤

 

引用和指针存在权限的放大和缩小。引用/指向同一个对象的时候才有权限的放大和缩小问题。

需要注意的是类似 int& rb = a*3; double d = 12.34; int& rd = d; 这样⼀些场 景下a*3的和结果保存在⼀个临时对象中, int& rd = d 也是类似,在类型转换中会产⽣临时对 象存储中间值,也就是时,rb和rd引⽤的都是临时对象,⽽C++规定临时对象具有常性,所以这⾥ 就触发了权限放⼤,必须要⽤常引⽤才可以。

所谓临时对象就是编译器需要⼀个空间暂存表达式的求值结果时临时创建的⼀个未命名的对象, C++中把这个未命名对象叫做临时对象。

 

const引用可以引用const对象,普通对象,临时对象。做参数时更好用,做函数形参时自己不会改变。

引用和指针的关系

语法概念上引⽤是⼀个变量的取别名不开空间,指针是存储⼀个变量地址,要开空间。

引⽤在定义时必须初始化,指针建议初始化,但是语法上不是必须的。

引⽤在初始化时引⽤⼀个对象后,就不能再引⽤其他对象;⽽指针可以在不断地改变指向对象。

引⽤可以直接访问指向对象,指针需要解引⽤才是访问指向对象。

sizeof中含义不同,引⽤结果为引⽤类型的⼤⼩,但指针始终是地址空间所占字节个数(32位平台下 占4个字节,64位下是8byte。

指针很容易出现空指针和野指针的问题,引⽤很少出现,引⽤使⽤起来相对更安全⼀些。

从汇编层,引用也是用指针实现的。

⽤inline修饰的函数叫做内联函数,编译时C++编译器会在调⽤的地⽅展开内联函数,这样调⽤内联 函数就不需要建⽴栈帧了,就可以提⾼效率。

inline对于编译器⽽⾔只是⼀个建议,也就是说,你加了inline编译器也可以选择在调⽤的地⽅不展 开,不同编译器关于inline什么情况展开各不相同,因为C++标准没有规定这个。inline适⽤于频繁 调⽤的短⼩函数,对于递归函数,代码相对多⼀些的函数,加上inline也会被编译器忽略。

C语⾔实现宏函数也会在预处理时替换展开,但是宏函数实现很复杂很容易出错的,且不⽅便调 试,C++设计了inline⽬的就是替代C的宏函数。

vs编译器debug版本下⾯默认是不展开inline的,这样⽅便调试,debug版本想展开需要设置⼀下 以下两个地⽅。

inline不建议声明和定义分离到两个⽂件,分离会导致链接错误。因为inline被展开,就没有函数地 址,链接时会出现报错


小讯
上一篇 2025-04-29 12:44
下一篇 2025-05-06 11:44

相关推荐

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容,请联系我们,一经查实,本站将立刻删除。
如需转载请保留出处:https://51itzy.com/kjqy/168415.html