【C++】入门基础(引用、inline、nullptr)

news2024/9/21 18:45:42

目录

一.引用

1.引用的定义

2.引用的特性

3.引用的使用场景

4.const引用

5.引用和指针的区别

二.inline

 三.nullptr


一.引用

1.引用的定义

引用不是新定义一个变量,而是给已经存在的变量取一个别名,编译器不会给引用变量开辟内存空间,它和它引用的变量共用同一块内存空间。简单来说,引用就是起别名,例如水浒传中林冲又名豹子头,这就是取别名,同时,林冲死了也就意味着豹子头死了,两者指向的都是同一个人。

用法:类型&引用别名 = 应用对象;

int main()
{
	//对a起别名b和c
	int 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.引用的特性

  1. 引用在定义的时候必须初始化。因为引用是一个别名,它的存在建立在主体存在的基础上,也就是说必须引用一个已经存在的对象,否则会引起编译报错。

  2. 一个变量可以有多个引用。正如一个人可以有多个外号,但这些引用都指向同一个对象。

  3. 引用一旦引用另一个实体,就不能再引用其他实体。引用一旦建立,就不能更改为其他实体的引用,这种“偷外号”的行为是不允许发生的。

  4. 允许引用其他引用。例如: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.引用和指针的区别

  1. 引用必须初始化,指针建议初始化,但语法上不是必须的
  2. 引用不开辟空间,但指针是储存一个变量地址,需要开空间
  3. 初始化后引用不可修改指向对象,而指针可以修改指向对象
  4. 引用直接访问指向对象,指针需要解引用才能访问
  5. sizeof时,引用是引用对象类型的大小,而指针始终是地址空间所占的字节个数(32位下是4字节,64位下是8字节)
  6. 引用更加安全,指针容易出现空指针和野指针的问题

二.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++基础知识,但还不算入门,接下里我会持续更新类和对象的内容,那才是面向对象编程的精髓。感谢观看,欢迎关注。 

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

(实测可用)(3)Git的使用——RT Thread Stdio添加的软件包,github与gitee冲突造成无法上传文件到gitee

★硬件资源&#xff1a;本文章以STM32L431RCT6做主控芯片做验证&#xff1b; ★IDE开发环境&#xff1a;RT Thread stdio&#xff1b; ★RT Thread 版本&#xff1a;V4.0.3 一、RT Thread Stdio加载软件包 1、如下图所示&#xff0c;通过RT Thread Stdio加载的软件包&#…

[FPGA]-时序传输模型分析

时序传输模型分析 FPGA内部时钟树 clk到达每个寄存器的时间不一致。 内部时钟树内部示意图如下所示&#xff1a; 在实际FPGA芯片内部&#xff0c;时钟到达每个寄存器的时钟偏差很小&#xff0c;但仍然存在&#xff1b;比如clk到达REG1花费时间0.2ns&#xff0c;到达REG6花费…

【Linux】基于环形队列RingQueue的生产消费者模型

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 目录 前言 环形队列的概念及定义 POSIX信号量 RingQueue的实现方式 RingQueue.hpp的构建 Thread.hpp Main.cc主函数的编写 Task.hpp function包装器的使用 总结 前言…

Torch-Pruning 库入门级使用介绍

项目地址&#xff1a;https://github.com/VainF/Torch-Pruning Torch-Pruning 是一个专用于torch的模型剪枝库&#xff0c;其基于DepGraph 技术分析出模型layer中的依赖关系。DepGraph 与现有的修剪方法&#xff08;如 Magnitude Pruning 或 Taylor Pruning&#xff09;相结合…

Python:setattr()函数和__setattr__()魔术方法

相关阅读 Pythonhttps://blog.csdn.net/weixin_45791458/category_12403403.html?spm1001.2014.3001.5482 setattr()是一个python内置的函数&#xff0c;用于设置一个对象的属性值&#xff0c;一般情况下&#xff0c;可以通过点运算符(.)完成相同的功能&#xff0c;但是getat…

[激光原理与应用-112]:南京科耐激光-激光焊接-焊中检测-智能制程监测系统IPM介绍 - 16 - 常见的产品指标

目录 一、光学传感器技术指标&#xff1a;实时信号采集与信号处理 &#xff08;1&#xff09;适用激光器的功率范围宽&#xff1a; &#xff08;2&#xff09;感光范围&#xff1a;350nm~1750nm&#xff1a;从可见光到红外光 &#xff08;3&#xff09;信号类型&#xff1a…

NSSCTF_RE(二)暑期

[CISCN 2021初赛]babybc LLVM是那个控制流平坦化混淆&#xff0c;bc是IR指令文件 得到64位elf文件 然后就慢慢分析&#xff0c;感觉太妙了我靠 一个数独游戏&#xff0c;用二个二维数组添加约束&#xff0c;一个二维数组作地图&#xff0c;慢慢看 最后用 z3 来解数独&#xf…

k8s快速部署一个网站

1&#xff09;使用Deployment控制器部署镜像&#xff1a; kubectl create deployment web-demo --imagelizhenliang/web-demo:v1 kubectl get deployment,pods[rootk8s-matser ~]# kubectl get pods NAME READY STATUS RESTARTS A…

25届平安产险校招测评IQ新16PF攻略:全面解析与应试策略

尊敬的读者&#xff0c;您好。随着平安产险校招季的到来&#xff0c;许多应届毕业生正积极准备着各项测评。本文旨在提供一份详尽的测评攻略&#xff0c;帮助您更好地理解平安产险的校招测评流程&#xff0c;以及如何有效应对。 25届平安产险平安IQ&#xff08;新&#xff09;测…

Java 设计模式系列:外观模式

简介 外观模式&#xff08;Facade Pattern&#xff09;是一种设计模式&#xff0c;又名门面模式&#xff0c;是一种通过为多个复杂的子系统提供一个一致的接口&#xff0c;而使这些子系统更加容易被访问的模式。该模式对外有一个统一接口&#xff0c;外部应用程序不用关心内部…

2024-07-14 Unity插件 Odin Inspector2 —— Essential Attributes

文章目录 1 说明2 重要特性2.1 AssetsOnly / SceneObjectsOnly2.2 CustomValueDrawer2.3 OnValueChanged2.4 DetailedInfoBox2.5 EnableGUI2.6 GUIColor2.7 HideLabel2.8 PropertyOrder2.9 PropertySpace2.10 ReadOnly2.11 Required2.12 RequiredIn&#xff08;*&#xff09;2.…

基于Python thinker GUI界面的股票评论数据及投资者情绪分析设计与实现

1.绪论 1.1背景介绍 Python 的 Tkinter 库提供了创建用户界面的工具&#xff0c;可以用来构建股票评论数据及投资者情绪分析的图形用户界面&#xff08;GUI&#xff09;。通过该界面&#xff0c;用户可以输入股票评论数据&#xff0c;然后通过情感分析等技术对评论进行情绪分析…

昇思25天学习打卡营第14天 | ShuffleNet图像分类

昇思25天学习打卡营第14天 | ShuffleNet图像分类 文章目录 昇思25天学习打卡营第14天 | ShuffleNet图像分类ShuffleNetPointwise Group ConvolutionChannel ShuffleShuffleNet模块网络构建 模型训练与评估数据集训练模型评估模型预测 总结打卡 ShuffleNet ShuffleNetV1是旷世科…

大模型系列3--pytorch dataloader的原理

pytorch dataloader运行原理 1. 背景2. 环境搭建2.1. 安装WSL & vscode2.2. 安装conda & pytorch_gpu环境 & pytorch 2.112.3 命令行验证python环境2.4. vscode启用pytorch_cpu虚拟环境 3. 调试工具3.1. vscode 断点调试3.2. py-spy代码栈探测3.3. gdb attach3.4. …

基于锚框的物体检测过程

说明&#xff1a;基于锚框的物体检测过程&#xff1a;分为单阶段和两阶段 整体步骤&#xff1a; 提供目标候选区域&#xff1a; 锚框提供了一组预定义的候选区域&#xff0c;这些区域可以覆盖各种尺度和长宽比的目标。通过这些锚框&#xff0c;可以在不同的位置和不同的尺度上…

02-Charles的安装与配置

一、Charles的安装 Charles的下载地址&#xff1a;https://www.charlesproxy.com/。 下载之后&#xff0c;傻瓜式安装即可。 二、Charles组件介绍 主导航栏介绍&#xff1a; 请求导航栏介绍&#xff1a; 请求数据栏介绍&#xff1a; 三、Charles代理设置 四、客户端-windows代理…

【Linux】多线程_6

文章目录 九、多线程7. 生产者消费者模型生产者消费者模型的简单代码结果演示 未完待续 九、多线程 7. 生产者消费者模型 生产者消费者模型的简单代码 Makefile&#xff1a; cp:Main.ccg -o $ $^ -stdc11 -lpthread .PHONY:clean clean:rm -f cpThread.hpp&#xff1a; #i…

React学习笔记02-----

一、React简介 想实现页面的局部刷新&#xff0c;而不是整个网页的刷新。AJAXDOM可以实现局部刷新 1.特点 &#xff08;1&#xff09;虚拟DOM 开发者通过React来操作原生DOM&#xff0c;从而构建页面。 React通过虚拟DOM来实现&#xff0c;可以解决DOM的兼容性问题&#x…

NSSCTF_RE(一)暑期

[SWPUCTF 2021 新生赛]简单的逻辑 nss上附件都不对 没看明白怎么玩的 dnspy分析有三个 AchievePoint , game.Player.Bet - 22m; for (int i 0; i < Program.memory.Length; i) { byte[] array Program.memory; int num i; array[num] ^ 34; } Environment.SetEnvironment…

【CICID】GitHub-Actions-SpringBoot项目部署

[TOC] 【CICID】GitHub-Actions-SpringBoot项目部署 0 流程图 1 创建SprinBoot项目 ​ IDEA创建本地项目&#xff0c;然后推送到 Github 1.1 项目结构 1.2 Dockerfile文件 根据自身项目&#xff0c;修改 CMD ["java","-jar","/app/target/Spri…