【C++初阶】C++基础(下)——引用、内联函数、auto关键字、基于范围的for循环、指针空值nullptr
目录
1. 引用
1.1 引用概念
1.2 引用特性
1.3 常引用
1.4 使用场景
1.5 传值、传引用效率比较
1.6 引用和指针的区别
2. 内联函数
2.1 概念
2.2 特性
3.auto关键字(C++11)
3.1 类型别名思考
3.2 auto简介
3.3 auto的使用细则
3.4 auto不能推导的场景
4. 基于范围的for循环(C++11)
4.1 范围for的语法
4.2 范围for的使用条件
5. 指针空值nullptr(C++11)
5.1 C++98中的指针空值
❀❀❀没有坚持的努力,本质上并没有多大的意义。
1. 引用
1.1 引用概念
类型& 引用变量名(对象名) = 引用实体(注意:引用类型必须和引用实体是同种类型的)

b叫做a的引用,b也可以叫做a的别名(abcd四个,只要有一个发生变化,其余都发生变化)
应用1:
void Swap(int& a, int& b) {int tmp = a;a = b;b = tmp; }数据进行交换,可以不用传指针,可以用引用
应用2:
#include <iostream>typedef struct ListNode {int val;struct ListNode* next; }LTNode;void LTPushBack_C(LTNode** pphead, int x) {//C语言,单链表尾插需要传结构体的二级指针,因为需要改变首部地址 }void LTPushBack_CPP(LTNode*& phead, int x) {//C++中,用引用,仅仅需要传结构体地址 }int main() {LTNode* plist = NULL;//初始化LTPushBack_C(&plist, 1);LTPushBack_CPP(plist, 1);return 0; }也可以引用指针类型的
注意:
typedef struct ListNode {int val;struct ListNode* next; }LTNode,*PLTNode;void LTPushBack_CPP(LTNode*& phead, int x) {//C++中,用引用,仅仅需要传结构体地址 } //这两个等同 void LTPushBack_CPP(PLTNode& phead, int x) {//C++中,用引用,仅仅需要传结构体地址 }
1.2 引用特性
代码展示:
#include <iostream>int main()
{int a = 10;int& b = a;int& c = a;int& d = b;//一个变量可以多次引用int& e;//代码运行到这里会报错,因为引用在定义时必须初始化int m = 2;b = m;//b在前面已经引用了a,在这里并不是成为m的别名,而是把m的值赋值给b,然后此时abcd的值都是2return 0;
}
1. 引用在 定义时必须初始化2. 一个变量可以有多个引用3. 引用一旦引用一个实体,再不能引用其他实体
1.3 常引用
const修饰的变量,只能读不能写(这里的权限,指的是读和写)
#include <iostream>int main() {int a = 0;int& b = a;//权限不变const int c = 2;int& d = c;//这里是错误的,权限不能被放大const int x = 3;const int& y = x;//这里是可以的,权限不变int m = 6;const int& n = m;//这里是可以的,权限缩小return 0; }取别名原则:对于引用类型,权限只能缩小,不能放大
临时变量具有常性
#include <iostream>int main() {int a = 10;int& b = a;const int& c = 20;//常量也可以取别名double d = 15.3;int f = d;//在这里,相当于f把自己的整数部分给一个临时变量,临时变量把值赋给f(临时变量具有常性)const int& e = d;//这里的e不是d的引用,而是临时变量的引用return 0; }
1.4 使用场景
(1)做参数
void Swap(int& a, int& b)
{int tmp = a;a = b;b = tmp;
}
可以不用传指针
(2)做返回值
代码1展示:(传值返回)
#include <iostream>int Count() {int n = 0;n++;return n; }//n出了这个函数就被销毁了,所以是赋值给临时变量的 int main() {int ret = Count();return 0; }函数返回过程,把返回的值n给一个临时变量,临时变量的类型就是函数类型(上述代码的int),临时变量再把值赋给主函数的ret。(临时变量即有一个拷贝)
代码2展示:(传引用拷贝)
#include <iostream> int& Count() {static int n = 0;//static不能去掉,如果去掉,就会涉及出现越界问题(因为空间被系统回收)n++;return n; }//返回int&,说明有一个临时引用是int&类型,临时引用是n的别名 int main() {int& ret = Count();//ret是临时引用的别名,return 0; }没有拷贝,效率高
如果函数返回时,出了函数作用域,如果返回对象还在 ( 还没还给系统 ) ,则可以使用引用返回, 如果已经还给系统了,则必须使用传值返回。(否则会出现越界问题)
注意:
#include <iostream>
int Count()
{int n = 0;n++;return n;
}
int main()
{const int& ret = Count();//因为是临时变量的别名,临时变量具有常性return 0;
}
1.5 传值、传引用效率比较
1.6 引用和指针的区别
语法的角度:引用是一个别名,没有额外开空间,指针存储的是地址,需要开一个4/8字节的空间;但是从底层的角度,是一样的方式实现的(汇编代码是一致的)
2. 内联函数
2.1 概念
知识复习:写一个ADD的宏
inline存在的意义:(1)解决宏函数晦涩难懂、容易写错(2)宏不支持调试
优点:(1)debug支持调试(2)不易写错,就是普通函数的写法(3)提升程序的效率
2.2 特性
知识点 :宏的优缺点?优点:1. 增强代码的复用性。2. 提高性能。缺点:1. 不方便调试宏。(因为预编译阶段进行了替换)2. 导致代码可读性差,可维护性差,容易误用。3. 没有类型安全的检查 。C++ 有哪些技术替代宏 ?1. 常量定义 换用 const2. 函数定义 换用内联函数
3.auto关键字(C++11)
3.1 类型别名思考

auto可以自动定义类型,根据等号后面的变量
C++中,typeid(A).name();可以知道A的类型是什么
3.2 auto简介
使用 auto 定义变量时 必须对其进行初始化 ,在编译阶段编译器需要根据初始化表达式来推导 auto 的实际类 型 。因此 auto 并非是一种 “ 类型 ” 的声明,而是一个类型声明时的 “占位符” ,编译器在编译期会将 auto 替换为 变量实际的类型 。
3.3 auto的使用细则
(1)auto与指针和引用结合起来使用
(auto*定义的必须是指针类型)
auto意义之一:类型很长时,懒得写,可以让他自动推导。
3.4 auto不能推导的场景
// 此处代码编译失败,auto不能作为形参类型,因为编译器无法对a的实际类型进行推导
void TestAuto(auto a)
{}
void TestAuto()
{int a[] = {1,2,3};auto b[] = {4,5,6};
} 3. 为了避免与C++98中的auto发生混淆,C++11只保留了auto作为类型指示符的用法
4. 基于范围的for循环(C++11)
4.1 范围for的语法
void TestFor()
{int array[] = { 1, 2, 3, 4, 5 };//加&的原因是e是array内容的拷贝,所以改变e不是改变array里面的内容for (auto& e : array){e *= 2;}//范围for,依次自动取arrar中的数据,赋值给e,自动判断结束for (auto e : array)//这里写int也可以{cout << e << " ";}
}
4.2 范围for的使用条件
void TestFor(int array[])
{for(auto& e : array)cout<< e <<endl;
} 这里的array是数组的首元素的地址,所以范围不定
5. 指针空值nullptr(C++11)
5.1 C++98中的指针空值
//指针初始化int* p1 = NULL;int* p2 = 0;int* p3 = nullptr;//建议用这一种
相关文章:
【C++初阶】C++基础(下)——引用、内联函数、auto关键字、基于范围的for循环、指针空值nullptr
目录 1. 引用 1.1 引用概念 1.2 引用特性 1.3 常引用 1.4 使用场景 1.5 传值、传引用效率比较 1.6 引用和指针的区别 2. 内联函数 2.1 概念 2.2 特性 3.auto关键字(C11) 3.1 类型别名思考 3.2 auto简介 3.3 auto的使用细则 3.4 auto不能推…...
OSI 7层模型 TCPIP四层模型
》Ref: 1. 这个写的嘎嘎好,解释了为啥4层7层5层,还有数据包封装的问题:数据包在网络中的传输过程详解_数据包传输_张孟浩_jay的博客-CSDN博客 2. HTTP协议 与 TCP协议 的区别,作为web程序员必须要懂 - 知乎 (zhihu.com) 3. 数据…...
iOS-持久化
目的 1.快速展示,提升体验 已经加载过的数据,用户下次查看时,不需要再次从网络(磁盘)加载,直接展示给用户 2.节省用户流量(节省服务器资源) 对于较大的资源数据进行缓存…...
PC音频框架学习
1.整体链路 下行播放: App下发音源→CPU Audio Engine 信号处理→DSP数字信号处理→Codec DAC→PA→SPK 上行录音: MIC拾音→集成运放→Codec ADC→DSP数字信号处理→CPU Audio Engine 信号处理→App 2.硬件 CPU PCH DSP(可选) Codec PA SPKbox MIC…...
机器学习:提取问题答案
模型BERT 任务:提取问题和答案 问题的起始位置和结束位置。 数据集 数据集 DRCDODSQA 先分词,然后tokenize 文章长度是不同的,bert的token的长度有限制,一般是512, self-attention的计算量是 O ( n 2 ) O(n^2) O(n…...
【Ansible】
目录 一、Ansible简介二、ansible 环境安装部署1、管理端安装 ansible 三、ansible 命令行模块(重点)1.command 模块2.shell 模块3、cron 模块4.user 模块5.group 模块6.copy 模块(重…...
分布式版本控制系统git详解
git 是目前世界上最先进的分布式版本控制系统 补充说明 git命令 很多人都知道,Linus在1991年创建了开源的Linux,从此,Linux系统不断发展,已经成为最大的服务器系统软件了。 Linus虽然创建了Linux,但Linux的壮大是靠…...
如何使用Python进行数据挖掘?
使用Python进行数据挖掘需要掌握以下几个关键步骤: 数据收集:首先,你需要获取你要进行数据挖掘的数据。可以从公共数据集、API、数据库等各种来源收集数据。 数据清洗:清洗数据是一个重要的步骤,它包括去除重复数据、…...
若依-前台无法正常启动,npm run dev失败
问题场景: 使用若依Vue前端分离版-基于SpringBoot的权限管理系统进行实战。 问题描述与解决 拉取若依项目后,根据官方开发文档(项目readme文档)进行依赖下载安装后,启动失败。 出现以下几个问题: 运行n…...
Spring之IoC源码分析及设计思想(一)——BeanFactory
关于Spring的IOC Spring 是一个开源的 Java 平台,它提供了一种简化应用程序开发的框架。它是一个分层的框架,包括两个主要的内核:控制反转(IOC)和面向切面编程(AOP)。IOC 允许应用程序将组件之…...
⛳ 面向对象面试题
面向对象面试题目录 ⛳ 面向对象面试题🚜 一,成员变量,局部变量,类变量存储在内存的什么地方?🐾 1.1,类变量(静态成员变量)📝 1.2,成员变量⭐ 1.3…...
Java中使用Gson操作json数据
Java中使用Gson操作json数据 引入依赖 <dependency><groupId>com.google.code.gson</groupId><artifactId>gson</artifactId><version>2.9.0</version></dependency>Gson工具类 package cn.test.util;import com.google.gso…...
Verilog语法学习——LV10_使用函数实现数据大小端转换
LV10_使用函数实现数据大小端转换 题目来源于牛客网 [牛客网在线编程_Verilog篇_Verilog快速入门 (nowcoder.com)](https://www.nowcoder.com/exam/oj?page1&tabVerilog篇&topicId301) 题目 描述 在数字芯片设计中,经常把实现特定功能的模块编写成函数&…...
Leetcode-每日一题【剑指 Offer II 009. 乘积小于 K 的子数组】
题目 给定一个正整数数组 nums和整数 k ,请找出该数组内乘积小于 k 的连续的子数组的个数。 示例 1: 输入: nums [10,5,2,6], k 100输出: 8解释: 8 个乘积小于 100 的子数组分别为: [10], [5], [2], [6], [10,5], [5,2], [2,6], [5,2,6]。 需要注意的是 [10,5,2]…...
html/javascript-表格的创建和使用
html中表格的创建和使用 一 摘要二 使用html table标签创建表格(在html文件中)三 使用javascript创建表格(在js文件中)四 表格属性的设置:4.1. 右边框的设置:4.2. 只给表格单元格加右边框4.3. 动态设置右边…...
[点微]同城原生微信小程序 小程序原生版 1.0.7(tom_xiaofenlei)
注意!!!这是点微后出的原生版小程序!!! 依赖点微同城分类主插件、点微同城小程序后端插件!!! 【以下为模块路径】 同城首页 pages/index/index 个人中心 pages/index/my 好店首页 pages/module/tcshop 商城首页 pages/module/tcmall 抢购首页 pages/module/tcqianggou…...
JDBC Some Templates
JDBCTemplate 是Spring对JDBC的封装,使用JDBCTemplate方便实现对数据的操作。 <!-- orm:Object relationship mapping m对象 关系 映射-->引入依赖 <!-- 基于Maven依赖的传递性,导入spring-content依赖即可导入当前所需的所有…...
dubbo启动指定ip不使用docker虚拟网络ip
java -D 配置系统属性 # 启动时加参数 -DDUBBO_IP_TO_REGISTRY 192.168.1.1 该ip为dubbo所在服务器的公网ip即可。 java -jar myDubboRpc-api.jar -DDUBBO_IP_TO_REGISTRY 192.168.1.1 # xjar启动 nohup ./xjar java -DDUBBO_IP_TO_REGISTRY11.22.33.44 -XX:UseG1GC -jar …...
Bobo String Construction
登录—专业IT笔试面试备考平台_牛客网 题目大意:给出一字符串t,求一个长为n的字符串,使tst中包含且仅包含两个t 1<n<1000;测试样例组数<1000 思路:一开始很容易想到如果t里有1,s就全0,否则s就全…...
基于java在线个人网站源码设计与实现
摘 要 随着社会及个人社交应用平台的飞速发展,人们的沟通成本逐渐降低,互联网信息的普及也进一步提升了人们对于信息的需求度,通过建立个人网站的方式来展示自己的生活信息同时利用平台结交新的朋友,借助个人网站平台的搭建不仅可…...
云原生核心技术 (7/12): K8s 核心概念白话解读(上):Pod 和 Deployment 究竟是什么?
大家好,欢迎来到《云原生核心技术》系列的第七篇! 在上一篇,我们成功地使用 Minikube 或 kind 在自己的电脑上搭建起了一个迷你但功能完备的 Kubernetes 集群。现在,我们就像一个拥有了一块崭新数字土地的农场主,是时…...
Python爬虫实战:研究feedparser库相关技术
1. 引言 1.1 研究背景与意义 在当今信息爆炸的时代,互联网上存在着海量的信息资源。RSS(Really Simple Syndication)作为一种标准化的信息聚合技术,被广泛用于网站内容的发布和订阅。通过 RSS,用户可以方便地获取网站更新的内容,而无需频繁访问各个网站。 然而,互联网…...
Mac软件卸载指南,简单易懂!
刚和Adobe分手,它却总在Library里给你写"回忆录"?卸载的Final Cut Pro像电子幽灵般阴魂不散?总是会有残留文件,别慌!这份Mac软件卸载指南,将用最硬核的方式教你"数字分手术"࿰…...
鸿蒙中用HarmonyOS SDK应用服务 HarmonyOS5开发一个生活电费的缴纳和查询小程序
一、项目初始化与配置 1. 创建项目 ohpm init harmony/utility-payment-app 2. 配置权限 // module.json5 {"requestPermissions": [{"name": "ohos.permission.INTERNET"},{"name": "ohos.permission.GET_NETWORK_INFO"…...
大模型多显卡多服务器并行计算方法与实践指南
一、分布式训练概述 大规模语言模型的训练通常需要分布式计算技术,以解决单机资源不足的问题。分布式训练主要分为两种模式: 数据并行:将数据分片到不同设备,每个设备拥有完整的模型副本 模型并行:将模型分割到不同设备,每个设备处理部分模型计算 现代大模型训练通常结合…...
基于matlab策略迭代和值迭代法的动态规划
经典的基于策略迭代和值迭代法的动态规划matlab代码,实现机器人的最优运输 Dynamic-Programming-master/Environment.pdf , 104724 Dynamic-Programming-master/README.md , 506 Dynamic-Programming-master/generalizedPolicyIteration.m , 1970 Dynamic-Programm…...
Pinocchio 库详解及其在足式机器人上的应用
Pinocchio 库详解及其在足式机器人上的应用 Pinocchio (Pinocchio is not only a nose) 是一个开源的 C 库,专门用于快速计算机器人模型的正向运动学、逆向运动学、雅可比矩阵、动力学和动力学导数。它主要关注效率和准确性,并提供了一个通用的框架&…...
Bean 作用域有哪些?如何答出技术深度?
导语: Spring 面试绕不开 Bean 的作用域问题,这是面试官考察候选人对 Spring 框架理解深度的常见方式。本文将围绕“Spring 中的 Bean 作用域”展开,结合典型面试题及实战场景,帮你厘清重点,打破模板式回答,…...
k8s从入门到放弃之HPA控制器
k8s从入门到放弃之HPA控制器 Kubernetes中的Horizontal Pod Autoscaler (HPA)控制器是一种用于自动扩展部署、副本集或复制控制器中Pod数量的机制。它可以根据观察到的CPU利用率(或其他自定义指标)来调整这些对象的规模,从而帮助应用程序在负…...
【无标题】湖北理元理律师事务所:债务优化中的生活保障与法律平衡之道
文/法律实务观察组 在债务重组领域,专业机构的核心价值不仅在于减轻债务数字,更在于帮助债务人在履行义务的同时维持基本生活尊严。湖北理元理律师事务所的服务实践表明,合法债务优化需同步实现三重平衡: 法律刚性(债…...

