C++初阶 -1- C++入门part2-引用

news2025/1/11 2:15:55

文章目录

  • 6.引用
    • 什么是引用?
    • 引用的使用
    • 引用的应用
      • 传值、传引用效率比较
      • 权限
      • 引用和指针的区别⭐
  • 7.内联函数
  • 8.auto关键字
  • 9.基于范围的for循环
  • 10.指针空值——nullptr

6.引用

什么是引用?

  • “别名”
int a = 0;
int& b = 0;

在这里插入图片描述
👆即 地址为0x000000BC0C6FFB94的空间即可以称为“a”,也可以成为“b”

引用:类型& 引用变量名(对象名) = 引用实体;
引用变量名 必须有且只有一个引用实体

  1. 可以取多个“别名”
  2. 可以给 “别名” “取别名”
  3. 可以给 任何类型 “取别名”
int a = 0;
int& b = a;
int& c = b;

int* p = &a;
int*& pb = p;

在这里插入图片描述

引用的使用

  • 引用必须初始化在这里插入图片描述
  • 常引用
void TestConstRef()
{
    const int a = 10;
    //int& ra = a;   // 该语句编译时会出错,a为常量
    //正确的:
    const int& ra = a;
    
    // int& b = 10; // 该语句编译时会出错,b为常量(非常量引用的初始值必须为左值),10为常量,int为整型变量
    //正确的:
    const int& b = 10;
    
    double d = 12.34;
    //int& rd = d; // 该语句编译时会出错,类型不同
    //正确的:
    const int& rd = d;
}

引用的应用

1.做函数参数:输出型函数,形参的改变需要影响实参

void Swap(int& x, int& y)
{
	int tmp = x;
	x = y;
	y = tmp;
}

int main()
{
	int x = 13, y = 7;
	Swap(x, y);

	cout << x << " " << y << endl;

	return 0;
}

2.做返回值:引用返回
在这里插入图片描述
如上图,引用返回的作用:①减少拷贝;②调用者可以修改返回对象
变量 add 的空间在函数结束后被归还给操作系统,则 add 空间储存的内容将不得而知。

  • sum.出了函数生命还在的变量可以用引用返回
//C语言:传值返回
int func(const int x, const int y)
{
	int n = x + y;
	return n;
}

//C++:引用返回
int& func()
{
	static int n = 0;
	n++;
	// ...
	return n;
}

int& Add(int x, int y)
{
	int add = x + y;
	return add;
}

int main()
{
	cout << "Add=" << Add(x, y) << endl;

	Count();
	Count();
	Count();
	Count();
	Count();
	cout << "Count=" << Count() << endl;
	return 0;
}

输出:
Add=-858993460 随机值
Count=6

传值、传引用效率比较

以值作为参数或者返回值类型,在传参和返回期间,函数不会直接传递实参或者将变量本身直接返回,而是传递实参或者返回变量的一份临时的拷贝,因此用值作为参数或者返回值类型,效率是非常低下的,尤其是当参数或者返回值类型非常大时,效率就更低。

权限

⭐指针、引用和赋值,权限可以缩小,但是不能放大

  • 权限放大:
const int c = 2;//对c空间只有“只读”的权限
	int& d = c;
  • 权限缩小:
int x = 1;//可读可写
const int& y = x;//可读
  • 权限保持:
const int* p1 = nullptr;
const int* p2 = p1;

📍类型转换会产生临时变量
在这里插入图片描述

引用和指针的区别⭐

语法上有区别,但底层实现本质上是相同的。

  1. 引用概念上定义一个变量的别名,指针存储一个变量地址。
  2. 引用在定义时必须初始化,指针没有要求
  3. 引用在初始化时引用一个实体后,就不能再引用其他实体,而指针可以在任何时候指向任何
    一个同类型实体
  4. 没有NULL引用,但有NULL指针
  5. 在sizeof中含义不同:引用结果为引用类型的大小,但指针始终是地址空间所占字节个数(32
    位平台下占4个字节)
  6. 引用自加即引用的实体增加1,指针自加即指针向后偏移一个类型的大小
  7. 有多级指针,但是没有多级引用
  8. 访问实体方式不同,指针需要显式解引用,引用编译器自己处理
  9. 引用比指针使用起来相对更安全

7.内联函数

inline修饰的函数叫做内联函数,编译时C++编译器会在调用内联函数的地方展开没有函数调用建立栈帧的开销,内联函数提升程序运行的效率。

  • C++ 推荐:
    1. constenum 代替宏常量
    2. inline 代替宏函数 → 适合“小”函数

inline 内联函数的特性:

  1. inline是一种以空间换时间的做法
  2. inline对于编译器而言只是一个建议,可能展开也可能不展开
  3. inline不建议声明和定义分离,分离会导致链接错误。因为inline被展开,就没有函数地址
    了,链接就会找不到。(内联函数不进符号表

在这里插入图片描述


8.auto关键字

auto 自动识别类型

int a = 0;
auto b = a;
auto c = &a;

在这里插入图片描述

  • auto 不能

    1. 一行命名多个
      在这里插入图片描述

    2. 不能声明数组
      在这里插入图片描述

  • aoto 的应用:
    简化代码

  • typedef 的缺陷

typedef char* ptr;

const ptr p1;(编译错误 typedef后实际上是: char* const p1;常量指针必须初始化;没有为什么,语法归档
const ptr* p2;//编译正常

9.基于范围的for循环

范围for——语法糖:对于一个有范围的集合,自动依次取其中的数据赋值给对象var(var只是这个取得一个变量名),自动判断结束

int main()
{
	int array[] = { 1, 2, 3, 4, 5 };
	for (auto& var : array)
		var *= 2;

	for (auto num : array)
		cout << num << " ";
	输出结果:2 4 6 8 10
	//这里的var和num都是变量名,两者一不一样或取什么名字都是不影响的

	return 0;
}
  • 使用条件:
    1. for循环迭代的范围必须是确定
    2. 迭代的对象要 实现++和== 的操作。

10.指针空值——nullptr

简而言之,NULL在C++中出现了bug,所以引入 nullptr

nullptr 使用注意:

  1. 在使用nullptr表示指针空值时,不需要包含头文件,因为nullptr是C++11作为新关键字引入 的。
  2. 在C++11中,sizeof(nullptr) 与 sizeof((void*)0)所占的字节数相同。
  3. 为了提高代码的健壮性,在后续表示指针空值时建议最好使用nullptr。

END

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

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

相关文章

Redis7搭建主从+集群三主三从主从关系由集群分配

目录文件不清晰的去Redis7搭建主从哨兵了解 别忘记关闭防火墙 hash算法一致性 1背景–主从关系由客户端构建分配 三台虚拟机&#xff0c;一台虚拟机搭建两个redis 且两个不同的端口 第一台ip和分配两个端口 6381 6382 --- 192.168.154.128 6381 6382 第二台ip和分配两个…

分析型数据库:分布式分析型数据库

分析型数据库的另外一个发展方向就是以分布式技术来代替MPP的并行计算&#xff0c;一方面分布式技术比MPP有更好的可扩展性&#xff0c;对底层的异构软硬件支持度更好&#xff0c;可以解决MPP数据库的几个关键架构问题。本文介绍分布式分析型数据库。 — 背景介绍— 目前在分布…

人工智能前沿——「全域全知全能」人类新宇宙ChatGPT

&#x1f680;&#x1f680;&#x1f680;OpenAI聊天机器人ChatGPT——「全域全知全能」人类全宇宙大爆炸&#xff01;&#xff01;&#x1f525;&#x1f525;&#x1f525; 一、什么是ChatGPT?&#x1f340;&#x1f340; ChatGPT是生成型预训练变换模型&#xff08;Chat G…

springBoot --- mybatisPlus自动生成代码

mybatisPlus自动生成代码mybatisPlus自动生成代码pom.xmlapplication.yml自动生成代码测试主启动类生成目录结果使用插件 --- 版本要求&#xff1a;3.4.0 版本以上pom.xml更新mybatisplus插件版本mp报错‘AutoGenerator()‘ has private access in ‘com.baomidou.mybatisplus.…

离散数学_九章:关系(2)

关系9.2 n元关系及其应用 1、n元关系&#xff0c;关系的域&#xff0c;关系的阶2、数据库和关系 1. 数据库 2. 主键 3. 复合主键 3、n元关系的运算 1. 选择运算 (Select) 2. 投影运算 (Project) 3. 连接运算 9.2 n元关系及其应用 n元关系&#xff1a;两个以上集合的元素间…

网络安全从业人员应该如何提升自身的web渗透能力?

前言 web 渗透这个东西学起来如果没有头绪和路线的话&#xff0c;是非常烧脑的。 理清 web 渗透学习思路&#xff0c;把自己的学习方案和需要学习的点全部整理&#xff0c;你会发现突然渗透思路就有点眉目了。 程序员之间流行一个词&#xff0c;叫 35 岁危机&#xff0c;&am…

Amazon SageMaker测评分享,效果超出预期

一、前言随着科技的进步和社会的发展&#xff0c;人工智能得到了愈加广泛的重视&#xff0c;特别是最近大火的Chatgpt&#xff0c;充分展现了研发通用人工智能助手广阔的研究和应用前景。让越来越多的组织和企业跟风加入到人工智能领域的研究中&#xff0c;但机器学习的实施是一…

项目---基于TCP的高并发聊天系统

目录 服务端 服务端视角下的流程图 一、数据库管理模块 1.1 数据库表的创建 1.2 .对于数据库的操作 1.2.1首先得连接数据库 1.2.2执行数据库语句 1.2.3 返回数据库中存放的所有用户的信息 1.2.4返回数据库中存放的所有用户的好友信息 二、用户管理模块 2.1、UserInfo类&…

深度学习和人工智能之间是什么样的关系?

深度学习与人工智能概念的潜在联系&#xff0c;我们依然借助维恩图来说明&#xff0c;如图4.1所示。 1、人工智能 “人工智能”这个概念新鲜时髦但又含混模糊&#xff0c;同时包罗万象。尽管如此,我们仍尝试对 人工智能进行定义:用一台机器处理来自其周围环境的信息,然后将这些…

学习系统编程No.10【文件描述符】

引言&#xff1a; 北京时间&#xff1a;2023/3/25&#xff0c;昨天摆烂一天&#xff0c;今天再次坐牢7小时&#xff0c;难受尽在不言中&#xff0c;并且对于笔试题&#xff0c;还是非常的困难&#xff0c;可能是我做题不够多&#xff0c;也可能是没有好好的总结之前做过的一些…

15.transformer全解

欢迎访问个人网络日志&#x1f339;&#x1f339;知行空间&#x1f339;&#x1f339; 文章目录1.基础介绍2.网络结构2.1 Input/Output Embedding2.2 自注意力机制 self-attention2.3 point-wise全连接层2.4 位置编码 Position Encoding3.输入处理过程示例4.代码实现1.基础介绍…

论文阅读和分析:Hybrid Mathematical Symbol Recognition using Support Vector Machines

HMER论文系列 1、论文阅读和分析&#xff1a;When Counting Meets HMER Counting-Aware Network for HMER_KPer_Yang的博客-CSDN博客 2、论文阅读和分析&#xff1a;Syntax-Aware Network for Handwritten Mathematical Expression Recognition_KPer_Yang的博客-CSDN博客 3、论…

自然语言处理(七): Deep Learning for NLP: Recurrent Networks

目录 1. N-gram Language Models 2. Recurrent Neural Networks 2.1 RNN Unrolled 2.2 RNN Training 2.3 (Simple) RNN for Language Model 2.4 RNN Language Model: Training 2.5 RNN Language Model: Generation 3. Long Short-term Memory Networks 3.1 Language M…

论文阅读【14】HDLTex: Hierarchical Deep Learning for Text Classification

论文十问十答&#xff1a; Q1论文试图解决什么问题&#xff1f; 多标签文本分类问题 Q2这是否是一个新的问题&#xff1f; 不是 Q3这篇文章要验证一个什么科学假设&#xff1f; 因为文本标签越多&#xff0c;分类就越难&#xff0c;所以就将文本类型进行分层分类&#xff0c;这…

【人工智能与深度学习】判别性循环稀疏自编码器和群体稀疏性

【人工智能与深度学习】判别性循环稀疏自编码器和群体稀疏性 判别类循环稀疏自编码器 (DrSAE)组稀疏组稀疏自编码器的问与答图像级别训练,无权重分享(weight sharing)的局域过滤器 (local filters)判别类循环稀疏自编码器 (DrSAE) DrSAE的设计结合了稀疏编码(稀疏自编码器)…

数据库并发控制基本概念和基本技术

并发控制与基本技术一、并发控制1. 概述2. 并发访问可能出现的问题二、并发控制的主要技术1、基本技术2、封锁及锁的类型2.1、什么是封锁2.2、基本封锁类型2.2.1、排它锁&#xff08;Exclusive Locks&#xff0c;简记为 X 锁&#xff09;2.2.2、共享锁&#xff08;Share Locks&…

基于ArkUI框架开发-ImageKnife渲染层重构

ImageKnife是一款图像加载缓存库&#xff0c;主要功能特性如下&#xff1a; ●支持内存缓存&#xff0c;使用LRUCache算法&#xff0c;对图片数据进行内存缓存。 ●支持磁盘缓存&#xff0c;对于下载图片会保存一份至磁盘当中。 ●支持进行图片变换&#xff1a;支持图像像素源图…

【SSconv:全色锐化:显式频谱-空间卷积】

SSconv: Explicit Spectral-to-Spatial Convolution for Pansharpening &#xff08;SSconv&#xff1a;用于全色锐化的显式频谱-空间卷积&#xff09; 全色锐化的目的是融合高空间分辨率的全色&#xff08;PAN&#xff09;图像和低分辨率的多光谱&#xff08;LR-MS&#xff…

【微服务】6、一篇文章学会使用 SpringCloud 的网关

目录一、网关作用二、网关的技术实现三、简单使用四、predicates(1) 网关路由可配置的内容(2) 路由断言工厂&#xff08;Route Predicate Factory&#xff09;五、filters(1) GatewayFilter(2) 给全部进入 userservice 的请求添加请求头(3) 全局过滤器 —— GlobalFilter(4) 过…

PX4从放弃到精通(二十七):固定翼姿态控制

文章目录前言一、roll/pitch姿态/角速率控制二、偏航角速率控制三、主程序前言 固件版本 PX4 1.13.2 欢迎交流学习&#xff0c;可加左侧名片 一、roll/pitch姿态/角速率控制 roll/pitch的姿态控制类似&#xff0c;这里只介绍roll姿态控制&#xff0c; 代码位置&#xff1a; …