【c++初阶】C++入门(下)

请添加图片描述

✅✅✅✅✅✅✅✅✅✅✅✅✅✅✅✅
✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨
🌿🌿🌿🌿🌿🌿🌿🌿🌿🌿🌿🌿🌿🌿🌿🌿
🌟🌟🌟🌟🌟🌟🌟🌟🌟🌟🌟🌟🌟🌟🌟🌟
🌟🌟 追风赶月莫停留 🌟🌟
🍀🍀🍀🍀🍀🍀🍀🍀🍀🍀🍀🍀🍀🍀🍀🍀
🌟🌟 平芜尽处是春山🌟🌟
🌟🌟🌟🌟🌟🌟🌟🌟🌟🌟🌟🌟🌟🌟🌟🌟
🌿🌿🌿🌿🌿🌿🌿🌿🌿🌿🌿🌿🌿🌿🌿🌿
✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨
✅✅✅✅✅✅✅✅✅✅✅✅✅✅✅✅

🍋C++入门

  • 🍑引用
    • 🍍引用定义
    • 🍍引用特性
    • 🍍常引用
    • 🍍引用使用的场景
    • 🍍引用和指针的区别
  • 🍑内联函数
    • 🍍定义
    • 🍍特性
  • 🍑auto关键字(C++11)
    • 🍍类型别名
    • 🍍auto简介
    • 🍍auto的用途
    • 🍍auto使用限制
  • 🍑基于范围的for循环(C++11)
    • 🍍范围for的用法
    • 🍍范围for使用规则
  • 🍑指针空值nullptr(C++11)
    • 🍍C++98中的指针空值
    • 🍍C++11中的指针空值

🍑引用

🍍引用定义

在C++中,引用是已存在变量的别名,或者可以理解为这个已存在变量的另一个名字,通过将声明符&放在变量名前来定义引用。

	int ret = 10;
	int& cur = ret;//定义引用类型
	cout << "cur = " << cur << endl << "ret = " << ret << endl;
	return 0 ;

在这里插入图片描述
注意:引用类型必须和引用实体是同种类型

🍍引用特性

(1)一旦引用被初始化为另一个对象,就不能在指向其它对象,但是一个对象可以有多个别名。

在这里插入图片描述

(2)引用必须在声明时被初始化,不然会报错。

在这里插入图片描述

(3)引用在声明时必须说明其类型。

在这里插入图片描述

(4)编译器不会为引用变量开辟内存空间,它和它引用的变量共用同一块内存空间。
在这里插入图片描述

🍍常引用

引用不能做常量的引用,不然会报错,如下图:
在这里插入图片描述

因为引用的是可以修改的值,而常量是定量不可以修改,在C语言中大家就知道const修饰的变量相较于普通的变量权限缩小,所以没有被const修饰的变量权限大于被const修饰的变量,所以在这里同样不可以如图中这样所写。

当然如果我们把引用的权限缩小,也可以实现上图中的写法,如下图:
在这里插入图片描述

🍍引用使用的场景

(1)做参数

大家不知道记得我们以前写的Swap()交换函数:
在这里插入图片描述
从图中,使用交换函数时,我们要传地址,还要用指针接受,有点麻烦了。

来看看引用做参数时的交换函数:
在这里插入图片描述
如图中的写法是不是看着就很舒服,以前写交换函数,可能大家还会遗漏地址,现在就很便利。

(2)做返回值

在这里插入图片描述

在这里插入图片描述

第一幅图中,使用的是传值返回,传值返回会创建一个中间的临时变量用来存储返回值,也就是最后返回的不是c而是c的拷贝,所以net就是接受实际运算的值。

而第二幅图,是引用返回,返回的是c的别名。调用函数会创建一个栈帧来存储临时的变量等信息,但是函数调用结束后这个栈帧就会被释放,再进行访问就会越界,所以cur的值就是返回值,但是在vs编译器中会进行优化,版本越高优化的越好,大家可以用其它编译器试试,所以返回的是确定的值。

🍍引用和指针的区别

引用和指针在编程中存在明显的区别。

首先,引用必须在声明时被初始化,而且一旦初始化后,就不能改变其引用的对象。这就意味着,引用具有更强的稳定性,并且不能被设为NULL。相对地,指针可以在任何时候被初始化,也可以指向NULL,并且可以随时改变指向的对象。这种灵活性虽然带来了更大的操作空间,但同时也增加了出错的可能性,使得指针在编程中相对更危险。

其次,从大小上看,引用的大小是所指向的变量的大小,因为引用只是一个别名而已。而指针的大小则是固定的,通常是指针变量自身在内存中所占的空间大小,例如在大多数32位系统中,指针的大小是4个字节。

最后,从使用的便捷性和安全性来看,引用具有优势。使用引用指向的内容时可以直接使用引用变量名,而不需要像使用指针那样使用*来解引用。同时,由于引用不能为空且不能改变指向,因此使用引用可以更安全地避免一些常见的编程错误。

总结:引用和指针在编程中各有其用途,但引用在稳定性和安全性上通常优于指针。在选择使用引用还是指针时,需要根据大家在实际应用中具体的编程需求和环境来决定。

🍑内联函数

🍍定义

内联函数是指在调用时,在函数调用处直接插入函数代码的函数。这种插入操作是由编译器在编译时自动完成的,而不需要在运行时进行函数调用。因此,内联函数可以消除函数调用的开销,包括参数传递和控制转移的开销,从而提高程序运行时的效率。

🍍特性

内联函数具有几个显著的特点:

代码替换:当编译器遇到内联函数的调用时,它会在调用点直接插入或替换函数的代码,而不是进行常规的函数调用。这消除了函数调用的开销,包括返回参数、执行return等过程。

提高执行效率:由于内联函数直接插入了函数调用处的代码,因此避免了函数调用的开销,从而提高了程序的执行效率。但是,如果内联函数体过大,会增加编译后的代码大小,可能导致程序运行时的空间开销增大。

定义与声明:内联函数的定义通常在头文件中进行,这样编译器在多处调用时都能见到定义。内联函数的声明和定义通常放在同一个头文件中。

编译时确定:内联函数的作用域规则与一般的函数相同。内联函数只是在调用时内联展开,而不是在定义时内联展开。如果编译器认为内联替换不能带来性能上的提升,它会忽略内联请求,将函数调用作为普通函数调用处理。

不能含有复杂的控制语句:内联函数体内不能有复杂的控制语句,如循环语句和switch语句,否则即使定义了内联函数,编译器也会把它当成普通函数来处理。

谨慎使用:虽然内联函数能够提升执行效率,但过度使用内联函数可能会使代码膨胀,增加编译后的代码大小,甚至可能导致程序性能下降。因此,应谨慎选择哪些函数作为内联函数。

总结:请注意,即使函数被声明为内联的,编译器也可以选择不内联该函数。这是因为编译器在编译时会考虑多种因素,如函数的大小、调用频率以及可能的优化效果等,来决定是否进行内联替换。

🍑auto关键字(C++11)

🍍类型别名

不管是在C语言中还是在C++中,我们都遇到过许多的类型别名,学习过程中我们遇到的类型别名越来越复杂,在实际的过程中也不方便我们书写,这个时候auto关键字的作用就体现出来了。

auto主要作用就是自动类型推断,简化了代码,提高了代码的可读性和可维护性

🍍auto简介

Auto是一个在多个编程语境中都有特定含义的关键词。在早期的C/C++中,auto被用作存储类型指示符,主要表示局部变量的存储期。在函数内部定义的变量成为局部变量,它们在使用auto修饰时具有自动存储期,即这些变量在进入声明它们的程序块时被创建,当退出该程序块时它们会被撤销。

在这里插入图片描述
这个d的类型大家可能有点陌生,等大家学到后面会明白,这个也是字符串类型。

🍍auto的用途

迭代器:在遍历容器(如:std::vector、std::map等)时,迭代器的类型可能较为复杂,使用auto可以简化迭代器的声明和使用。

范围基于的for循环:C++引入的范围基于的for循环与auto结合使用,可以方便的遍历容器中的元素,而无需关心元素的具体类型。

模板编程:在处理模板函数或类时,auto能够自动推导那些难以手动指定的类型,从而简化了模板的编写和使用。

大概有常用的这三个用途,当然还有其它用途,在这里就不一一列举了。

大家比较熟悉的可能就是for循环了,我用for循环给大家演示演示。

在这里插入图片描述

两个的结果都是一样的,不过从图中大家应该能感受到auto使用的方便,特别是需要输入复杂类型的时候auto体现的作用更大。

🍍auto使用限制

函数参数:auto不能用于函数参数的类型声明。这是因为函数参数的类型必须在函数调用之前就已经确定,而auto类型是在编译时根据初始化表达式推导出来的。因此,在函数声明或定义时,函数参数不能使用Auto。

在这里插入图片描述

类的非静态成员变量:auto同样不能用于类的非静态成员变量的初始化。类的成员变量在类定义时就需要确定其类型,而auto类型的推导是基于初始化表达式的,这在类的成员变量上下文中并不适用。静态成员变量虽然可以在类外部定义和初始化,但也不能使用auto,因为静态成员变量的类型也需要在类定义时确定。

数组定义:auto不能用于定义数组。数组需要明确指定其元素类型和大小,而Auto只能推导出一个单一的类型,无法同时确定数组的类型和大小。

在这里插入图片描述

模板参数:auto也不能作为模板参数。模板参数需要在模板实例化时具有确定的类型,而auto类型的推导是基于具体的使用上下文的,这在模板参数中并不适用。

🍑基于范围的for循环(C++11)

🍍范围for的用法

在C++98中for循环遍历的方式:

在这里插入图片描述

而在实际应用过程中,对于有范围的集合由程序员来说明范围,明显是多余的,有的时候还会犯错误。因此在C++引入了基于范围的for循环。for循环后的括号由冒号“ :”分为两部分:第一部分是范围内用于迭代的变量,第二部分则表示被迭代的范围:

在这里插入图片描述

当然在新的for循环中continue和break的作用依然有效

🍍范围for使用规则

范围for循环在C++中是一种方便遍历容器(如数组、向量、列表等)或数组元素的语法结构。使用范围for循环时,需要满足一些特定的条件:

迭代对象的范围必须明确:对于数组,这意味着必须知道第一个元素和最后一个元素的范围。对于类或其他容器,通常应提供begin和end方法,这些方法定义了for循环迭代的范围。如果范围不确定,编译器会报错。

迭代的对象必须支持"++“和”==" 操作:这是因为范围for循环在内部使用迭代器来遍历元素,它需要能够递增迭代器(通过++)并比较迭代器(通过 ==)来确定何时结束循环。

容器必须支持迭代器,并且有begin和end函数:例如,队列(queue)不支持迭代器,因此无法使用范围for循环来遍历队列。如果尝试这样做,编译器会报错,指出容器没有begin或end成员函数。

在这里插入图片描述
上图中写法就是错的,因为不知道数组a的大小。

还有就是关于迭代器这个问题,大家目前还没有学到,现在了解一下就可以了

🍑指针空值nullptr(C++11)

🍍C++98中的指针空值

在C++98中,指针的空值通常使用宏NULL来表示。NULL在C++标准库头文件cstddef(通常通过包含cstdlib或旧式的stdlib.h间接包含)中定义,其值通常被定义为整数0或(void*)0。C++98中,将指针初始化为NULL是一种常见的做法,用于表示指针不指向任何有效的内存地址。

🍍C++11中的指针空值

需要注意的是,在C++11及以后的版本中,引入了一个新的关键字nullptr,它提供了更好的类型安全性和更明确的语义来表示空指针。nullptr的类型是std::nullptr_t,它不能与整数0混淆,并且可以自动转换为任何指针类型。因此,如果你正在使用C++11或更高版本,就使用nullptr来初始化指针,而不是NULL,NULL在C++11或者更高版本中使用会报错。

C++入门篇的知识点就讲解完毕了,如果还有些知识点没讲到,欢迎大家指正,我会及时完善。

请添加图片描述
请添加图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/482209.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Spark与flink计算引擎工作原理

Spark是大批量分布式计算引擎框架&#xff0c;scale语言开发的&#xff0c;核心技术是弹性分布式数据集&#xff08;RDD&#xff09;可以快速在内存中对数据集进行多次迭代&#xff0c;支持复杂的数据挖掘算法及图形计算算法&#xff0c;spark与Hadoop区别主要是spark多个作业之…

试题E(求阶乘)

解题思路&#xff1a; 写不出来&#xff0c;看的题解。要想凑个10&#xff0c;就必须要有一个2和5&#xff0c;但是明显在一个阶乘里&#xff0c;因子为2的数量一定多余5的数量&#xff0c;所以计算5的数量。 解题代码&#xff1a; import java.util.Scanner; ​ public clas…

题目:异或森林(蓝桥OJ 3400)

问题描述&#xff1a; 解题思路&#xff1a; 一个数也可以看作是一段区间&#xff0c;当该区间的异或和为完全平方数时则符合题意。 我们需要注意枚举的完全平方的上限。 异或前缀和减小时间复杂度。 题解&#xff1a; #include <bits/stdc.h> using namespace std; usi…

SpringBoot整合MyBatisPlus实现增删改查

✅作者简介:大家好,我是Leo,热爱Java后端开发者,一个想要与大家共同进步的男人😉😉🍎个人主页:Leo的博客 💞当前专栏: 循序渐进学SpringBoot ✨特色专栏: MySQL学习 🥭本文内容:SpringBoot整合MyBatisPlus实现增删改查 📚个人知识库: Leo知识库,欢迎大家…

Aztec的客户端证明

1. 引言 隐私保护 zk-rollup 的证明生成与通用 zk-rollup 的证明生成有很大不同。原因是给定交易中存在特定数据&#xff08;由私有函数处理&#xff09;&#xff0c;我们希望保持完全私有。在本文中&#xff0c;我们探讨了用于证明私有函数正确执行的客户端证明生成&#xff…

6.3 BP神经网络

在多层感知器被引入的同时&#xff0c;也引入了一个新的问题&#xff1a;由于隐藏层的预期输出并没有在训练样例中给出&#xff0c;隐藏层结点的误差无法像单层感知器那样直接计算得到。 为了解决这个问题&#xff0c;反向传播&#xff08;BP&#xff09;算法被引入&#xff0…

限时免费!Unity 资源商店威尔房间精品资源等你来领!

Unity 资源商店威尔房间精品资源分享 资源介绍资源特色免费领取 Unity 商店资源&#xff1a;Will’s Room Environment, Dormitory Room Environment 免费获取。 资源介绍 好消息来啦&#xff01;Unity 资源商店的威尔房间精品资源正在限时免费中&#xff01;这是一个非常受欢迎…

用 Appium 搭建自动化测试环境

基于Appium框架的自动化开发环境搭建 万事开头难&#xff0c;自动化开发环境的搭建会比较麻烦。以下详细讲解如何在mac os操作系统下&#xff0c;搭建基于Appium的自动化开发环境。 1、Android开发环境搭建&#xff08;JDK/SDK/AndroidStudio&#xff09;请自行百度,所需安装包…

同义词的作用

oracle从入门到总裁:​​​​​​https://blog.csdn.net/weixin_67859959/article/details/135209645 同义词 同义词本质上属于近义词的概念&#xff0c;它是表、索引、视图等模式对象的一个别名 通过为模式对象创建同义词&#xff0c;可以隐藏对象的实际名称和所有者信息&a…

懒人必备!轻松小窍门,MacBook如何删除app?ccleaner怎么卸载

MacBook凭借其优雅的设计、强大的性能以及macOS系统的高效率&#xff0c;成为了许多人的首选电脑。然而&#xff0c;与Windows系统不同&#xff0c;macOS在删除应用程序方面略显复杂&#xff0c;这让不少用户感到困惑。特别是当我们想要释放磁盘空间&#xff0c;或是彻底清除不…

【计算机网络实践】Cisco Packet Tracer局域网组网(FTP服务器通过交换机连接客户端)

本文为应对计算机网络第一次实验所写的预习报告 一、实验准备 一台装有Cisco Packet Tracer的PC机&#xff0c;一个大学生大脑。 二、了解FTP和Cisco Packet Tracer 具体内容可在百度搜索&#xff0c;在物理机上用FileZilla Server实现ftp可参看我前面的文章。Cisco Packet Tr…

基于springboot+vue的影院订票系统

博主主页&#xff1a;猫头鹰源码 博主简介&#xff1a;Java领域优质创作者、CSDN博客专家、阿里云专家博主、公司架构师、全网粉丝5万、专注Java技术领域和毕业设计项目实战&#xff0c;欢迎高校老师\讲师\同行交流合作 ​主要内容&#xff1a;毕业设计(Javaweb项目|小程序|Pyt…

R语言:microeco:一个用于微生物群落生态学数据挖掘的R包,第八:trans_func class

# 生态学研究人员通常对微生物群落的功能特征感兴趣&#xff0c;因为功能或代谢数据对于解释微生物群落的结构和动态以及推断其潜在机制是强有力的。 # 由于宏基因组测序复杂且昂贵&#xff0c;利用扩增子测序数据预测功能谱是一个很好的选择。 # 有几个软件经常用于此目标&…

Matlab使用教程(持续更新)

1. Matlab Matlab被广泛的应用在数据分析&#xff0c;汽车仿真&#xff0c;机器人以及医学研究等众多方面。 它可以帮助我们理解研究复杂的系统。 在60年代和70年代&#xff0c;计算机使得科学家和工程师完成了以前不可能进行的计算&#xff1b;但是需要懂得计算机编程。 C…

Python Flask框架 -- ORM模型与表的映射

ORM模型 对象关系映射(Object Relationship Mapping)&#xff0c;简称ORM&#xff0c;是一种可以用Python面向对象的方式来操作关系型数据库的技术&#xff0c;具有可以映射到数据库表能力的Python类我们称之为ORM模型。一个ORM模型与数据库中一个表相对应&#xff0c;ORM模型中…

奶酪(蓝桥杯,acwing,并查集)

现有一块大奶酪&#xff0c;它的高度为 hℎ&#xff0c;它的长度和宽度我们可以认为是无限大的&#xff0c;奶酪中间有许多半径相同的球形空洞。 我们可以在这块奶酪中建立空间坐标系&#xff0c;在坐标系中&#xff0c;奶酪的下表面为 z0&#xff0c;奶酪的上表面为 zh。  …

阿里云服务器租用费用_公司官网多少钱一年?

阿里云服务器租用费用&#xff0c;搭建公司官网多少钱一年&#xff1f;搭建公司官网推荐2核4G5M带宽&#xff0c;优惠价199元一年&#xff0c;ECS u1实例企业客户专享&#xff0c;2核4G&#xff0c;5M固定带宽&#xff0c;80G ESSD Entry盘&#xff0c;活动页面 aliyunfuwuqi.c…

两数之和(python)

官方题目描述&#xff1a; 给定一个整数数组 nums 和一个整数目标值 target&#xff0c;请你在该数组中找出 和为目标值 target 的那 两个 整数&#xff0c;并返回它们的数组下标。 你可以假设每种输入只会对应一个答案。但是&#xff0c;数组中同一个元素在答案里不能重复出现…

国际品牌交期长 雷卯来帮忙

在当今的电子元器件市场中&#xff0c;防静电电子元器件的需求日益增长。无论是通信安防、医疗、消费类电子、照明行业、航空航天还是汽车电子等领域都会使用到防静电产品&#xff0c;使得防静电电子元器件的需求也呈现出爆发式的增长。在这一市场中&#xff0c;雷卯品牌凭借其…

JavaScript原型、原型对象、原型链系列详解(一)

(一)、JavaScript原型 原型 JavaScript 是一门面向对象的编程语言&#xff0c;其中原型&#xff08;prototype&#xff09;是一个重要的概念&#xff0c;它提供了一种创建对象的方式&#xff0c;使对象可以共享属性和方法。在 JavaScript 中&#xff0c;每个对象都有一个原型&a…