C++之入门之引用,内联函数

news2024/11/26 3:48:42

一、引用

1、引用的概念

在C++中,引用的本质其实就是给一个已经存在的变量”起别名“。也就是说,引用与它所引用的对象共用一块空间。(同一块空间的多个名字)

就比如说,李逵又叫黑旋风,而黑旋风就是指李逵本人,只是名字换了而已。

int a = 20;

int* pa = &a;	//指针
int& ra = a;	//引用

2、引用的特性 

1、引用在使用时必须初始化

2、一个变量可以有多个引用,但一个引用只能有一个实体对象

 可以看出:地址相同,abcd共用一个空间。

引用还有几点需要注意:1、引用无法改变指向

char& ra = a;
char& ra = b;	//错误,引用一旦确立后,就无法再改变其指向
ra = b;	//这个没问题,实际结果为 a = 'B' 即将 b 的内容赋值给 a

2、引用不存在多级引用

char& ra = a;
char&& b = ra;	//非法,不存在多级引用
char& b = ra;	//合法,实际结果为 char& b = a;

三、常引用

指针和引用在赋值或者初始化时,权限可以被缩小或者保持,但不可进行修改。

来看如下代码:

    // 权限放大(error)
    //const int c = 2;//const 修饰的常量不可以进行修改,可以理解只具有读的属性,不具有写的属性,而d可以修改,所以权限被放大
    //int& d = c;//这里正确写法应为const int& d=c;
 
    //const int* p1 = NULL;
    //int* p2 = p1;//同上,前面加个const即可,const int* p2=p1; (√)
 
    // 权限保持
    const int c = 2;
    const int& d = c;
 
    const int* p1 =NULL;
    const int* p2 = p1;
 
    // 权限缩小
    int x = 1;//x可以进行修改,可以理解为具有读和写的属性,而x是const修饰的,只具有读的属性,权限缩小了
    const int& y = x;
 
    int* p3 = NULL;
    const int* p4 = p3;//同上

引用主要有以下的使用场景:

1、做参数:

void swap(int& ra, int& rb)
{
	//有了引用之后,不需要再解引用,也能达到指针的效果
	int tmp = ra;
	ra = rb;
	rb = tmp;
}

 2、做返回值:

//返回值
int& Test()
{
    static int a = 10;
    a++;
    return a;//也会产生临时变量,但是临时变量的类型是int& 也就是a的别名,即临时变量就是返回的a,减少了拷贝操作
}
int main()
{
    int ret = Test();
    return 0;
}

这就是引用返回,即在返回类型前面加上&,虽然也需要借助临时变量的存在,但是由于临时变量的类型为int& ,即临时变量就是a,所以就减少了临时变量的拷贝工作,会使效率得到提升。当引用做返回值时,接收到的变量就是函数返回时的本体,就是变量ret。

不过需要注意的是:

 这段代码是错误的,原因是:val是函数 func 中的局部变量,当函数结束后,变量就被销毁了,此时可能得到正确的结果(编译器未清理),也可能得到错误的结果(编译器已清理)。

这就告诫我们如果是局部变量就不适合使用引用调用,而生命周期是较长的变量,适合使用引用返回,不需要创建临时变量。

二、内联函数

1、内联函数的概念

我们知道在创建函数的过程中:一个函数在开始调用时会建立函数栈帧,结束调用时会销毁函数栈帧,而函数栈帧的建立与销毁是有空间和时间上的开销的。

对于功能简单,而调用次数很多的函数来说,每次调用都重新开辟栈帧势必就会造成效率的降低,在C语言中们使用宏函数来解决这个问题:我们直接将 要调用的函数写成宏函数,这样使得程序在预处理阶段直接将调用的函数替换成相应的代码,从而不再建立函数栈帧。

比如交换函数代码:


#define Add(x,y) ((x)+(y))  //宏函数

宏定义除了复杂以外还有如下缺点:

1、不能进行调试,宏是直接进行替换的

2、没有类型的安全检查

 所谓内联函数就是在函数实现前加上 inline 修饰,此时函数会被编译器标记为内联函数。

//此时的 Add 函数就是一个内联函数
inline int Add(int x, int y)
{
	return x + y;
}
内联函数有如下特点:
  • 在 Debug 模式下,函数不会进行替换,可以进行调试
  • 在 Realse 模式下,函数会像宏函数一样展开,提高程序运行速度
  • 内联函数弥补了宏函数的不足,同时吸收了宏函数速度快的优点

三、auto关键字

在代码的编写中,随着程序的越来越复杂,所用的类型也越来越复杂,所以我们就需要引入auto关键字。

1、auto功能

auto 关键字能直接识别目标变量类型,然后自动转换为相应类型

int a = 10;
int* b = &a;

auto aa = a;	//此时 aa 为 int
auto bb = b;	//此时 bb 为 int*

不过在以后的学习过程中会遇到名字很长的变量,这就要用到auto关键字了。

#include <string>
#include <map>
int main()
{
	std::map<std::string, std::string> a{ { "apple", "苹果" }, { "orange","橙子" },{"pear","梨"} };
	std::map<std::string, std::string>::iterator it = a.begin();
	while (it != m.end())
	{
		//....
	}
	return 0;
}

auto的功能还可以指定转化类型。

int a = 10;

auto* pa = a;	//指定 pa 为 int*
auto& ra = a;	//指定 pa 为 int&

不过要记住:

auto a = 1, b = 2.2;	//非法,类型不统一

这个定义变量是错误的。

四、基于范围的for循环

在C++中,我们有更简介的方法来使用for循环,不用向之前这么繁杂。就像Python中使用for循环方法类似,在一个范围里进行for循环的。

来看如下的代码:

void TestFor()
{
	int array[] = { 1,2,3,4,5 };

	//使用引用进行迭代--可以修改原数组
	for (auto& e : array)
		e *= 2;

	//使用局部变量进行迭代--不能修改原数组
	for (auto e : array)
		cout << e << " ";

	cout << endl;  //换行
}

int main() {
	TestFor();
}

 for循环后的括号被冒号分为两部分:第一部分是范围内用于迭代的变量,第二部分则表示被迭代的范围。

 范围for的使用条件:1、范围大小必须确定 2、迭代对象要使用++,==的操作。

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

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

相关文章

线程安全实例分析

一、变量的线程安全分析 成员变量和静态变量是否线程安全&#xff1f; ● 如果它们没有共享&#xff0c;则线程安全 ● 如果它们被共享了&#xff0c;根据它们的状态是否能够改变&#xff0c;又分两种情况 —— 如果只有读操作&#xff0c;则线程安全 —— 如果有读写操作&am…

STM32学习笔记-USART串口通信+与野火STM32F407板载ESP8266进行通信

文章目录STM32USART介绍STM32USART框图第一部分第二部分第三部分发送器时序图接收器第四部分软件部分&#xff1a;STM32通过USART与板载ESP8266通讯实验板载WIFI模块电路图实现方式&#xff1a;第一步&#xff1a;配置USART1和USART3的GPIO及其中断第二步&#xff1a;通过中断服…

(2023版)零基础入门网络安全/Web安全,收藏这一篇就够了

由于我之前写了不少网络安全技术相关的文章和回答&#xff0c;不少读者朋友知道我是从事网络安全相关的工作&#xff0c;于是经常有人私信问我&#xff1a; 我刚入门网络安全&#xff0c;该怎么学&#xff1f; 要学哪些东西&#xff1f; 有哪些方向&#xff1f; 怎么选&#x…

智慧渔业海洋鱼类捕捉系统

我国的水产捕捞业可分为海洋捕捞、远洋捕捞和淡水捕捞三类&#xff0c;其中淡水渔业是指在淡水水域进行捕捞、养殖和加工淡水水产品的社会生产领域。近年来&#xff0c;随着经济水平的提高和淡水渔业的快速发展&#xff0c;捕捞业规模不断壮大。尽管渔业已从单纯的捕捞发展为系…

卷麻了,00后测试用例写的比我还好,简直无地自容......

经常看到无论是刚入职场的新人&#xff0c;还是工作了一段时间的老人&#xff0c;都会对编写测试用例感到困扰&#xff1f;例如&#xff1a; 如何编写测试用例&#xff1f; 作为一个测试新人&#xff0c;刚开始接触测试&#xff0c;对于怎么写测试用例很是头疼&#xff0c;无法…

Apple主推的智能家居是什么、怎么用?一篇文章带你从零完全入门 HomeKit

如果你对智能家居有所了解&#xff0c;那应该或多或少听人聊起过 HomeKit。由 Apple 开发并主推的的 HomeKit 既因为产品选择少、价格高而难以成为主流&#xff0c;又因其独特的优秀体验和「出身名门」而成为智能家居领域的焦点。HomeKit 究竟是什么&#xff1f;能做什么&#…

供应链的有效管理,分析指标有哪些

对于企业而言&#xff0c;供应链是一个很复杂的、体系化的生态系统&#xff0c;从原材料、到供应商、到生产、仓库、物流&#xff0c;最后到达经销商或者最终客户那里&#xff0c;这个链条很长。相关的分析指标也有很多&#xff0c;在这些指标里面也有非常多可以扩展、延申的内…

Android 系统的启动流程

前言&#xff1a;从开机的那一刻&#xff0c;到开机完成后launcher将所有应用进行图标展示的这个过程&#xff0c;大概会有哪一些操作&#xff1f;执行了哪些代码&#xff1f;作为Android开发工程师的我们&#xff0c;有必要好好的梳理一遍。既然要梳理Android系统的启动流程&a…

Python-scatter散点图及颜色大全

# -*- coding: utf-8 -*- import numpy as np import matplotlib.pyplot as pltplt.rcParams[font.sans-serif][SimHei] plt.rcParams[axes.unicode_minus] False #matplotlib画图中中文显示会有问题&#xff0c;需要这两行设置默认字体plt.xlabel(X) plt.ylabel(Y) plt.xlim…

人工智能——离线情况下自动给视频添加字幕,支持中文,英文,日文等等

前言 最近打开百度网盘&#xff0c;看到播放视频有一个AI字幕功能&#xff0c;心情非常激动&#xff0c;看视频的同时可以看自动生成的字幕&#xff0c;防止听不清视频中人物的话语 然而不是SVIP,我试用过了之后就没有这个功能选项了 我在想&#xff0c;如果随便哪一个“免费”…

Windows 安装RocketMQ

文章目录一、RocketMQ是什么&#xff1f;二、准备工作1.环境要求2.下载与解压3.启动MQ4. 测试是否成功启动三、安装管理端1. 代码下载2. 修改配置文件3. 启动MQ客户端jar包四、rocketMQ代码的使用入门五、问题记录1. 启动mqbroker.cmd没有反应2.消费者重复消费消息一、RocketMQ…

二叉搜索树实现

树的导览 树由节点&#xff08;nodes&#xff09;和边&#xff08;edges&#xff09;构成&#xff0c;如下图所示。整棵树有一个最上端节点&#xff0c;称为根节点&#xff08;root&#xff09;。每个节点可以拥有具有方向的边&#xff08;directed edges&#xff09;&#xf…

第51天|LeetCode503.下一个更大元素 II、LeetCode42. 接雨水

1.题目链接&#xff1a;下一个更大元素 II 题目描述&#xff1a; 给定一个循环数组 nums &#xff08; nums[nums.length - 1] 的下一个元素是 nums[0] &#xff09;&#xff0c;返回 nums 中每个元素的 下一个更大元素 。 数字 x 的 下一个更大的元素 是按数组遍历顺序&#…

Android kotlin 组件间通讯 - LiveEventBus 及测试(更新中)

<<返回总目录 文章目录 一、LiveEventBus是什么二、测试一、LiveEventBus是什么 LiveEventBus是Android中组件间传递消息,支持AndroidX,Event:事件,Bus:总线 范围全覆盖的消息总线解决方案 进程内消息发送App内,跨进程消息发送App之间的消息发送更多特性支持 免配…

进制转换(二进制,八进制,十进制,十六进制)涵盖整数与小数部分,内容的图片全为手写【详细图解】

各种进制之间的相互转换1. 各进制表示数1.1 数码1.2 基数1.3 位权2. 十进制转换为其他进制2.1 整数部分2.2 小数部分3. 其他进制转换为十进制4. 二进制转换为八进制5. 二进制转换为十六进制6. 八进制转换为十六进制1. 各进制表示数 二进制&#xff1a;0&#xff0c;1逢二进一 八…

Java企业开发学习笔记(5下)采用注解方式使用AOP

该文章主要为完成实训任务&#xff0c;详细实现过程及结果见【http://t.csdn.cn/FBkpc】 文章目录二、采用注解方式使用AOP2.1 创建所需自包2.2 创建杀龙任务2.3 创建勇敢骑士类2.4 创建吟游诗人切面2.5 创建Spring配置类2.6 创建骑士测试类2.7 运行测试方法testBraveKnight()&…

【学习总结】Kalibr标定相机与IMU

本文仅用于记录自己学习过程。 使用方法 Kalibr包括&#xff1a;相机内参&#xff0c;多相机外参&#xff0c; (已知IMU和相机内参的)相机与IMU标定&#xff0c;以及扩展Kalibr支持IMU内参标定。 当已知IMU内参和相机内参后&#xff0c;使用按照指定方式录制的rosbag&#x…

西电数据库简答题核心考点汇总(期末真题+知识点)

文章目录前言一、关系代数1.1 真题一1.2 真题二二、SQL语句2.1 真题一2.2 真题二三、事务3.1 真题一四、关系理论4.1 真题一4.2 真题二五、数据库设计5.1 样例一5.2 考题二前言 主要针对西安电子科技大学《数据库系统》的概念核心考点进行汇总&#xff0c;包含核心考点。 【期…

第14天-ElasticSearch环境配置,构建检索服务及商品上架到ES库

1.ElasticSearch概念 官网介绍&#xff1a;https://www.elastic.co/cn/what-is/elasticsearch/ 官网学习文档&#xff1a;https://www.elastic.co/guide/en/elasticsearch/reference/current/index.html 1.1.ElasticSearch与MySQL的比较 MySQL有事务性,而ElasticSearch没有…

GEBCO海洋数据下载

一、数据集简介 GEBCO&#xff08;General Bathymetric chart of the Oceans&#xff09;旨在为世界海洋提供最权威的、可公开获取的测深数据集。 目前的网格化测深数据集&#xff0c;即GEBCO_2022网格&#xff0c;是一个全球海洋和陆地的地形模型&#xff0c;在15角秒间隔的…