【C++】入门基础(引用、inline、nullptr)
目录
一.引用
1.引用的定义
2.引用的特性
3.引用的使用场景
4.const引用
5.引用和指针的区别
二.inline
三.nullptr
一.引用
1.引用的定义
引用不是新定义一个变量,而是给已经存在的变量取一个别名,编译器不会给引用变量开辟内存空间,它和它引用的变量共用同一块内存空间。简单来说,引用就是起别名,例如水浒传中林冲又名豹子头,这就是取别名,同时,林冲死了也就意味着豹子头死了,两者指向的都是同一个人。
用法:类型&引用别名 = 应用对象;
int main()
{//对a起别名b和cint a = 0;int& b = a;int& c = a;cout << a << endl;cout << b << endl;cout << c << endl;cout << &a << endl;cout << &b << endl;cout << &c << endl;return 0;
}
2.引用的特性
引用在定义的时候必须初始化。因为引用是一个别名,它的存在建立在主体存在的基础上,也就是说必须引用一个已经存在的对象,否则会引起编译报错。
一个变量可以有多个引用。正如一个人可以有多个外号,但这些引用都指向同一个对象。
引用一旦引用另一个实体,就不能再引用其他实体。引用一旦建立,就不能更改为其他实体的引用,这种“偷外号”的行为是不允许发生的。
允许引用其他引用。例如:int& b = a,int &c = b;此时就是c引用了b,但b也是引用的a,此时,b,c都是a的别名。
int a = 0;
int& b = a;
int c = 20;
//b已经引用a的情况下,不能更改为引用c
//以下直接看作赋值
b = c;
cout << a << endl;
cout << b << endl;
cout << c << endl;
3.引用的使用场景
引用在实践中主要是用于引用传参和做返回值,能够减少拷贝提高效率,同时能够改变引用对象和被引用对象。
引用传参跟指针传参的功能是类似的,但引用传参看着更简洁也更方便。例如,对于Swap函数的实现而言,引用传参可以这样实现:
void Swap(int& a, int& b)
{int tmp = a;a = b;b = tmp;
}
引用返回值就要看使用场景了,例如在栈(Stack)的实现中,有一个函数叫STTop用于得到栈顶元素,返回值是int,只是一个数值的拷贝,具有常性,无法做左值,即无法进行修改。
但若返回值改为int&,那么此时就是对返回的栈顶元素取别名,那么就可以进行修改了。如下所示
typedef int STDatatype;
typedef struct Stack
{int* a;int capacity;int top;
}ST;//直接引用传参
void STInit(ST& rs, int n = 4)
{rs.a = (STDatatype*)malloc(sizeof(STDatatype) * n);rs.capacity = n;rs.top = 0;
}void STPush(ST& rs, STDatatype x)
{rs.a[rs.top] = x;rs.top++;
}//int STTop(ST& rs)
//{
// return rs.a[rs.top - 1];
//}int& STTop(ST& rs)
{return rs.a[rs.top - 1];
}
int main()
{ST s;STInit(s,4);STPush(s, 1);STPush(s, 2);STTop(s) = 4;return 0;
}
4.const引用
const引用可以用来引用普通对象,普通对象是能读能写,但const引用后,引用是只读不写,注意:对象本体还是可以写的,只是引用(别名)用const修饰了不能写,这叫权限缩小。
const引用也可以用来引用const对象,此时就叫权限平移,因为引用和本体的权限是相同的,都被const修饰,只能读不能写。
普通引用不能用来引用const对象,这是权限放大。原本本体就不能被修改,但引用后反而能被修改了,这合理吗?这种写法是禁止的,也会进行如下报错。
引用临时对象需要使用const引用。什么是临时对象?临时对象出现在以下这几种情况:
类型转化:如下double类型转化为int引用
double a = 1.1;
const int& b = a;
表达式结果:如下a*3就是一个表达式,需要临时对象储存结果
int a = 1;
const int& b = a*3;
5.引用和指针的区别
- 引用必须初始化,指针建议初始化,但语法上不是必须的
- 引用不开辟空间,但指针是储存一个变量地址,需要开空间
- 初始化后引用不可修改指向对象,而指针可以修改指向对象
- 引用直接访问指向对象,指针需要解引用才能访问
- sizeof时,引用是引用对象类型的大小,而指针始终是地址空间所占的字节个数(32位下是4字节,64位下是8字节)
- 引用更加安全,指针容易出现空指针和野指针的问题
二.inline
使用inline修饰的函数就是内联函数,编译时编译器会将其在调用的地方展开,这样调用内联函数就需要建立栈帧了,可以提高效率。inline就是为了替代C语言中宏函数而实现的,宏函数实现很复杂而且容易出错,不方便调试,inline才运营而生。
当然inline对于编译器而言只是一个建议,是否展开取决于编译器本身,一般来说,inline适用于频繁调用的短小函数,对于递归函数,代码较多的函数,就算加上inline编译器也会选择忽略。
line不建议声明和定义分离到两个文件,分离会导致链接错误。但可以在同一个项目的不同源文件内定义函数名相同但实现不同的inline函数。
注:class类中的函数默认是inline
三.nullptr
在C语言中,NULL其实是一个宏,它的定义是:
#ifndef NULL#ifdef __cplusplus#define NULL #else#define NULL ((void *)0)#endif#endif
那么在使用时就会产生歧义,例如在调用空值的指针时,就有可能调用到int类型的重载函数,例如:
void f(int x)
{cout << "f(int x)" << endl;
}
void f(int* x)
{cout << "f(int* x)" << endl;
}
int main()
{f(0);f(NULL);return 0;
}//结果是两次都是调用的f(int x)
因此在C++11中引入了nullptr,这是一个特殊的关键字,它可以转化为任意类型的其他指针类型,但不能转化为整数类型,这就避免上图的出错。
看到这里,就能对有了一定的C++基础知识,但还不算入门,接下里我会持续更新类和对象的内容,那才是面向对象编程的精髓。感谢观看,欢迎关注。
相关文章:

【C++】入门基础(引用、inline、nullptr)
目录 一.引用 1.引用的定义 2.引用的特性 3.引用的使用场景 4.const引用 5.引用和指针的区别 二.inline 三.nullptr 一.引用 1.引用的定义 引用不是新定义一个变量,而是给已经存在的变量取一个别名,编译器不会给引用变量开辟内存空间,…...
24/07/10数据结构(5.1213)链表OJ
继续练习题: 7.判断链表是不是回文结构 对于一个链表,设计一个时间复杂度O(n)空间复杂度O(1)的算法,判断是否为回文结果 给定一个链表的头指针A,返回一个bool值代表其是否为回文结构. 测试样例:1->2->2->1 返回:ture bool chkPalindrome(ListNode* A){ …...

C++ 入门基础:开启编程之旅
引言 C 是一种高效、灵活且功能强大的编程语言,广泛应用于系统软件、游戏开发、嵌入式系统、科学计算等多个领域。作为 C 语言的扩展,C 不仅继承了 C 语言的过程化编程特性,还增加了面向对象编程(OOP)的支持ÿ…...

据传 OpenAI秘密研发“Strawberry”项目
每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗?订阅我们的简报,深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同,从行业内部的深度分析和实用指南中受益。不要错过这个机会,成为AI领…...

简单的SQL字符型注入
目录 注入类型 判断字段数 确定回显点 查找数据库名 查找数据库表名 查询字段名 获取想要的数据 以sqli-labs靶场上的简单SQL注入为例 注入类型 判断是数字类型还是字符类型 常见的闭合方式 ?id1、?id1"、?id1)、?id1")等,大多都是单引号…...
HttpClient调用SpringBoot项目的文件上传接口实现文件上传
1.导入httpclient的jar包 这里导入了httpclient、httpmime11 <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0" xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xsi:sch…...

[leetcode]kth-smallest-element-in-a-sorted-matrix 有序矩阵中第k小元素
. - 力扣(LeetCode) class Solution { public:bool check(vector<vector<int>>& matrix, int mid, int k, int n) {int i n - 1;int j 0;int num 0;while (i > 0 && j < n) {if (matrix[i][j] < mid) {num i 1;j;…...

【经典面试题】是否形成有环链表
1.环形链表oj 2. oj解法 利用快慢指针: /*** Definition for singly-linked list.* struct ListNode {* int val;* struct ListNode *next;* };*/typedef struct ListNode ListNode; bool hasCycle(struct ListNode *head) {ListNode* slow head, *fast…...

Flask 用 Redis 缓存键值对-实例
Flask 使用起 Redis 来简直就是手到擒来,比 MySQL 简单多了,不需要那么多配置,实际代码就这么多,直接复制就能用。除了提供简单实用的实例以外,本文后面还会简单介绍一下 Redis 的安装与使用,初学者也能一看…...

我的世界1.21多种服务端开服教程,原版/Forge/Fabric/Paper/Mohist...,Minecraft开服教程
Minecraft(MC)1.21版多种服务端开服教程,我的世界1.21服务器搭建教程,MC原版/Forge/Fabric/Paper/Mohist服务端搭建教程,我的世界MOD/插件服开服教程。 本教程使用 Linux系统MCSManager 面板来搭建Minecraft服务器。 …...

docker安装nginx并配置https
参考 docker安装nginx并配置https-腾讯云开发者社区-腾讯云 (tencent.com) 证书的生成 参见:SpringBoot项目配置HTTPS接口的安全访问(openssl配置)_配置接口访问-CSDN博客 步骤 1: 拉取Nginx镜像 docker pull nginx 好使的镜像如下&#x…...

永磁同步电机控制算法--基于 SVM 的无磁链环 DTC
永磁同步电机无磁链环 DTC 通过控制定子磁链交轴分量来直接控制转矩,不再要求控制磁链幅值恒定,省去了传统 DTC 中的磁链环,不仅转矩响应更快,有效抑制了转矩脉动,而且提高了电机功率因数。但无磁链环 DTC 方案仍采用传…...
如何避免在 Docker 容器中遇到 MAC 地址冲突和 IP 地址冲突的问题
在 Docker 容器中遇到 MAC 地址冲突和 IP 地址冲突的问题时,通常是由于 Docker 在分配网络资源时出现了一些问题。虽然这种情况并不常见,但仍有可能发生。以下是一些原因和可能的解决方案: 原因分析 Docker 版本问题:某些 Docke…...
arm64架构下源码编译安装kafka —— 筑梦之路
一般来说,直接使用官方提供的二进制文件即可,没有必要使用源码编译安装的方式,而对于有特殊用途的,选择源码编译安装无疑是更好地选择。比如修改源码实现想要的功能,mirrormaker2保持topic名称不变。 git clone https…...

LabVIEW前面板占满整个屏幕(转)
希望在运行一个LabVIEW程序时,它的前面板能够占据整个屏幕,且不显示Windows的任务栏或其他任何的LabVIEW菜单选项。怎样才能实现这一功能? 您可以通过手动配置或编程的方式实现该功能。 手动配置VI属性 您可以通过以下操作,将…...
Promise.all、any、race和allSettled的相同点与不同点与应用场景
在JavaScript中,Promise对象是一种处理异步操作的方式。它允许我们以一种更优雅的方式来处理异步代码,而不是使用回调函数。在Promise中,有一些方法可以帮助我们更好地管理多个Promise实例,这些方法包括Promise.all、Promise.any、…...
Ubuntu下如何设置程序include搜索路径及链接路径
添加库的include及lib路径 linux下系统默认路径为 /usr/include, /usr/local/include, gcc在编译程序时会按照当前目录路径->系统默认路径->系统环境变量的路径方式去查找,所以当我们想调用的库未安装在系统默认路径时,我们可以通过手动添加环境变…...

FLinkCDC引起的生产事故(二)
背景: 最近在做实时数据的抽取工作,利用FLinkCDC实时抽取目标库Oracle的数据到Doris中,但是在抽取的过程中,会导致目标库的生产库数据库非常卡顿,为了避免对生产环境的数据库造成影响,对生产环境的数据库利…...

【产品经理】WMS多仓调拨转移说明
对于仓储管理来说,越来越多企业开始应用WMS进行系统化的管理,以提升仓库的作业效率。本文作者从业务流程和基础功能两个方面展开介绍,希望对你有帮助。 一、业务流程 。在线下业务流程拓展,仓库不断增多的过程中,由于…...

每日一练:奇怪的TTL字段(python实现图片操作实战)
打开图片,只有四种数字:127,191,63,255 最大数字为255,想到进制转换 将其均转换为二进制: 发现只有前2位不一样 想着把每个数的前俩位提取出来,组成新的二进制,然后每…...
变量 varablie 声明- Rust 变量 let mut 声明与 C/C++ 变量声明对比分析
一、变量声明设计:let 与 mut 的哲学解析 Rust 采用 let 声明变量并通过 mut 显式标记可变性,这种设计体现了语言的核心哲学。以下是深度解析: 1.1 设计理念剖析 安全优先原则:默认不可变强制开发者明确声明意图 let x 5; …...

测试微信模版消息推送
进入“开发接口管理”--“公众平台测试账号”,无需申请公众账号、可在测试账号中体验并测试微信公众平台所有高级接口。 获取access_token: 自定义模版消息: 关注测试号:扫二维码关注测试号。 发送模版消息: import requests da…...

工业安全零事故的智能守护者:一体化AI智能安防平台
前言: 通过AI视觉技术,为船厂提供全面的安全监控解决方案,涵盖交通违规检测、起重机轨道安全、非法入侵检测、盗窃防范、安全规范执行监控等多个方面,能够实现对应负责人反馈机制,并最终实现数据的统计报表。提升船厂…...
在鸿蒙HarmonyOS 5中实现抖音风格的点赞功能
下面我将详细介绍如何使用HarmonyOS SDK在HarmonyOS 5中实现类似抖音的点赞功能,包括动画效果、数据同步和交互优化。 1. 基础点赞功能实现 1.1 创建数据模型 // VideoModel.ets export class VideoModel {id: string "";title: string ""…...

vscode(仍待补充)
写于2025 6.9 主包将加入vscode这个更权威的圈子 vscode的基本使用 侧边栏 vscode还能连接ssh? debug时使用的launch文件 1.task.json {"tasks": [{"type": "cppbuild","label": "C/C: gcc.exe 生成活动文件"…...
论文解读:交大港大上海AI Lab开源论文 | 宇树机器人多姿态起立控制强化学习框架(一)
宇树机器人多姿态起立控制强化学习框架论文解析 论文解读:交大&港大&上海AI Lab开源论文 | 宇树机器人多姿态起立控制强化学习框架(一) 论文解读:交大&港大&上海AI Lab开源论文 | 宇树机器人多姿态起立控制强化…...
docker 部署发现spring.profiles.active 问题
报错: org.springframework.boot.context.config.InvalidConfigDataPropertyException: Property spring.profiles.active imported from location class path resource [application-test.yml] is invalid in a profile specific resource [origin: class path re…...

Kafka入门-生产者
生产者 生产者发送流程: 延迟时间为0ms时,也就意味着每当有数据就会直接发送 异步发送API 异步发送和同步发送的不同在于:异步发送不需要等待结果,同步发送必须等待结果才能进行下一步发送。 普通异步发送 首先导入所需的k…...

GO协程(Goroutine)问题总结
在使用Go语言来编写代码时,遇到的一些问题总结一下 [参考文档]:https://www.topgoer.com/%E5%B9%B6%E5%8F%91%E7%BC%96%E7%A8%8B/goroutine.html 1. main()函数默认的Goroutine 场景再现: 今天在看到这个教程的时候,在自己的电…...

day36-多路IO复用
一、基本概念 (服务器多客户端模型) 定义:单线程或单进程同时监测若干个文件描述符是否可以执行IO操作的能力 作用:应用程序通常需要处理来自多条事件流中的事件,比如我现在用的电脑,需要同时处理键盘鼠标…...