【C++入门(4)】引用、内联函数、auto

news2024/11/22 23:39:41

一、引用与类型转换

我们看下面这个例子。

用 int & 给 double 类型的变量起别名,编译器报错:

int main()
{
	double b = 3.14;
	int a = b;
	int& x = b;
	return 0;
}

用 const int & 给 double 类型的变量起别名,成功:

int main()
{
	double b = 3.14;
	int a = b;
	const int& x = b;
	return 0;
}

我们知道用 double 类型的变量给 int 类型的变量赋值是肯定没问题的,那么到引用时怎么会出现这种情况呢?

这是因为这些操作都属于类型转换,而在类型转换时,不论是这样的隐式类型转换,还是强制类型转换,都不是简单的直接将右值赋给左值,而是先创建了一个临时变量来接收右值,再通过这个临时变量,把值赋给左值。

这个临时变量是一个常值,可以说是被 const 修饰的。当这个类型转换的语句执行时,编译器先创建了一个这样的常量,里面存放变量b的整数部分的值,再将这个常值赋给变量a。

当我们使用引用时,我们知道,别名本身并不会新开辟一块内存空间,而是和被引用变量共用同一块空间,本质上仍是被引用变量,所以别名的类型名中,去除掉 & 后剩下的的部分,要和被引用变量保持严格一致。因此在上面的例子中,起别名的时候,它的类型名也应该带上 const 才可以。

二、内联函数

每次调用函数的时候,编译器都会在内存上建立一个函数栈帧。如果某个函数使用频繁,调用次数非常多,那么在程序运行的时候,建立和销毁栈帧的开销就会很大,影响程序运行速度。

所以C++中给出了一个优化方案,就是可以使用内联函数,来使函数不是再通过建立栈帧的方式运行,而是像宏一样,在函数被调用的地方展开。

inline void Swap(int* pa, int* pb)
{
	int tmp = *pa;
	*pa = *pb;
	*pb = tmp;
}

inline 是声明内联函数的关键字,表示这个函数是一个内联函数。

Debug 版本下,为了方便程序员进行调试,内联函数是不展开的,而是像普通函数一样去建立栈帧。

inline 对于编译器而言,只是一个建议,并不是说用了inline,函数就一定会展开。一般来说,只有当这个函数的内容才会展开,而当函数内容过长时候,还是会像普通函数一样,通过建立栈帧的方式被调用。一个内联函数具体是会展开还是会建立栈帧,是取决于所使用的编译器的。

内联函数还不可以声明和定义分离:

//F.cpp
#include <iostream>
#include "F.h"
inline void f()
{
	std::cout << 100000 << std::endl;
}
//

//F.h
inline void f();
//

//test.cpp
#include "F.h"
int main()
{
	f();
	return 0;
}
//

如果内联函数的声明和定义分别在不同的文件里,编译器就会报错。这是因为内联函数的调用逻辑是展开而非建立栈帧,所以内联函数可以认为是没有地址的。而在这个例子中,main函数在调用这个内联函数时,使用的是寻找函数地址的方法,于是导致了链接错误。

三、关键字auto(自动推导)

1、auto概念

C语言中我们声明一个变量的时候,需要使用具体的类型:

int a;
char b;
double c;

在C++中,我们可以使用 auto 来省略掉前面具体类型的声明,而是用初始化值来让编译器自动推导出这个变量的类型:

auto a = 10;

2.auto的一些小用法

	auto a = 10;        //(1)
	auto pa = &a;
	auto* pb = &a;      //(2)
	auto& c = a;        //(3)

(1)中auto可以接收一个值,也可以接收指针;

(2)中auto*只可以接收指针;

(3)中auto&是用于取别名。 

3.范围for

auto还可以用于自动遍历数组:

#include <iostream>

using namespace std;

int main()
{
	int arr[] = { 1,2,3,4,5,6,7 };
	
	for (auto i : arr)
	{
		cout << i << ' ';
	}
	cout << endl;
	return 0;
}

在for循环的括号里,数组的值会依次赋给变量i,并且会自动判断结束。

这种用法被称为“范围for”,可以很方便的来遍历数组。

这里要注意的是,如果for循环中对e做出修改,是不会影响到数组中的值的:

这是因为 i 就是一个单独的变量,和数组 arr 无关,只是数组将值赋给了这个变量而已。

如果要在循环for中改变数组的值,可以用引用的方式创建变量 i :

其实循环for中也是可以用具体的类型,比如int,来声明循环变量 i 的,只是不常用。因为auto可以对任意类型的数组使用,而如果用int就只能循环int的数组,而不能循环其他的,比如float的数组。

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

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

相关文章

厂里资讯之app端文章搜索

app端文章搜索 1) 内容介绍 文章搜索 ElasticSearch环境搭建 索引库创建 文章搜索多条件复合查询 索引数据同步 搜索历史记录 Mongodb环境搭建 异步保存搜索历史 查看搜索历史列表 删除搜索历史 联想词查询 联想词的来源 联想词功能实现 2) 搭建ElasticSearch环境 …

A comprehensive review of machine learning-based models for fake news detection

Abstract 互联网在假新闻传播中的作用使其成为一个严重的问题&#xff0c;需要复杂的技术来自动检测。为了应对 Facebook、Twitter、Instagram 和 WhatsApp 等社交媒体网站上误导性材料的快速传播&#xff0c;本研究探索了深度学习方法和各种分类策略领域。该研究特别调查了基…

Spring Bean详解

Spring Bean作用域 默认情况下&#xff0c;所有的 Spring Bean 都是单例的&#xff0c;也就是说在整个 Spring 应用中&#xff0c; Bean 的实例只有一个 如果我们需要创建多个实例的对象&#xff0c;那么应该将 Bean 的 scope 属性定义为 prototype&#xff0c;如果 Spring 需…

【C++11】详谈隐式类型转换

&#x1f389;博主首页&#xff1a; 有趣的中国人 &#x1f389;专栏首页&#xff1a; C进阶 &#x1f389;其它专栏&#xff1a; C初阶 | Linux | 初阶数据结构 小伙伴们大家好&#xff0c;本片文章将会讲解 C11中 隐式类型转换 的相关内容。 如果看到最后您觉得这篇文章写得…

基于Java的高校校园点餐系统

开头语&#xff1a; 你好&#xff0c;我是计算机专业的学长&#xff0c;如果你对高校校园点餐系统感兴趣或有相关开发需求&#xff0c;欢迎联系我。 开发语言&#xff1a;Java 数据库&#xff1a;MySQL 技术&#xff1a;JSP技术 工具&#xff1a;Eclipse、Tomcat 系统展示…

示例:WPF中如何不卡顿页面的情况加载大量数据

一、目的&#xff1a;在开发过程中经常会遇到一个ListBox列表里面需要加载大量数据&#xff0c;但是加载过程中会假死卡顿影响用户体验&#xff0c;或者是你的主页面加载了大量控件&#xff0c;或者切换到一个有大量元素的页面都会有这种体验&#xff0c;因为加载的都是UI元素不…

网工内推 | 中国电信、香港宽频系统工程师,CCIE认证优先,最高年薪25w

01 中国电信股份有限公司浙江分公司 &#x1f537;招聘岗位&#xff1a;系统架构师 &#x1f537;岗位职责&#xff1a; 1、做好客户网络和信息安全产品的解决方案支撑、交付及后续运营维护&#xff0c;做好相关产数项目的支撑。 2、根据信息安全管理要求&#xff0c;负责客户…

【论文精读】RayMVSNet

今天读的是发表在CVPR2022上的无监督MVS文章&#xff0c;作者来自于国防科大。 文章链接&#xff1a;RayMVSNet 项目地址&#xff1a;Github Abstract 作者希望直接优化每个camera ray上的深度值&#xff0c;所以提出这个RayMVSNet来学习1D implicit field的序列预测。使用了…

SCI一区TOP|常青藤优化算法(IVYA)原理及实现【免费获取Matlab代码】

目录 1.背景2.算法原理2.1算法思想2.2算法过程 3.结果展示4 .参考文献5.代码获取 1.背景 2024年&#xff0c;M Ghasemi受到自然界中常青藤生长行为启发&#xff0c;提出了常青藤优化算法&#xff08;Ivy Algorithm, IVYA&#xff09;。 2.算法原理 2.1算法思想 IVYA模拟常青…

嵌入式web 服务器boa的编译和移植

编译环境&#xff1a;虚拟机 ubuntu 18.04 目标开发板&#xff1a;飞凌OKA40i-C开发板&#xff0c; Linux3.10 操作系统 开发板本身已经移植了boa服务器&#xff0c;但是在使用过程中发现POST方法传输大文件时对数据量有限制&#xff0c;超过1M字节就无法传输&#xff0c;这是…

python运算符和表达式实战

1.判断回文数 回文数就是将其反向排列&#xff0c;与原来相等 n1 n2 int(input("请输入&#xff1a; ")) t 0 while n2>0 :# 取余数t t*10n2%10# 取整数n2 // 10 if n1 t:print("是回文数") else:print("不是回文数") 2.字符串转换&…

2024青海三支一扶报名流程图解❗

报考公告 1、招考人数&#xff1a; 1910 人 2、报名时间&#xff1a;6月20-6月25 3、笔试时间&#xff1a;7月6日 4、笔试内容&#xff1a;综合知识和能力素质测验 &#x1f534;线上报名流程图解 一、本次报名采用线上报名方式&#xff0c;考生需登录《青海省人事考试信息网》…

【漏洞复现】契约锁电子签章平台 add 远程命令执行漏洞(XVE-2023-23720)

0x01 产品简介 契约锁电子签章平台是上海亘岩网络科技有限公司推出的一套数字签章解决方案。契约锁为中大型组织提供“数字身份、电子签章、印章管控以及数据存证服务”于一体的数字可信基础解决方案,可无缝集成各类系统,让其具有电子化签署的能力,实现组织全程数字化办公。通…

连接Huggingface报requests.exceptions.SSLError错误

最近在学习使用 SHAP 算法解释 BERT 模型的输出结果&#xff0c;然而在从 Huggingface 上导入模型和数据集的过程中出现了网络连接相关的错误&#xff0c;本文用于记录错误类型和解决错误的方法。 1 代码示例 SHAP 官方展示的代码如下&#xff1a; import datasets import nu…

基于SSM的个人博客管理系统

有需要请加文章底部Q哦 可远程调试 基于SSM的个人博客管理系统 一 介绍 个人博客管理系统基于SSM框架开发&#xff0c;数据库mysql&#xff0c;前端layui。系统角色分为用户和管理员。(附带配套设计文档!) 技术栈&#xff1a;JavaSSM框架mysqllayuiIDEAMaventomcat8.5jdk1.8 …

大语言模型架构---Transformer 模型

文章目录 输入编码多头自注意力机制前馈网络层编码器解码器当前主流的大语言模型都基于 Transformer 模型进行设计的。Transformer 是由多层的多头自注意力(Multi-head Self-attention)模块堆叠而成的神经网络模型。原始的 Transformer 模型由编码器和解码器两个部分构成,而…

基于PLC的全自动洗衣机控制系统课设

一、设计题目 1.1课题内容 根据设计参数和控制要求&#xff0c;设计一全自动洗衣机&#xff0c;画出其运行框图及梯形图控制程序的编制&#xff0c;并画出硬件接线图。 1.2设计参数 1.3控制要求 &#xff08;1&#xff09;按下启动按扭及水位选择开关&#xff0c;开始进水直…

PHP转Go系列 | 变量常量的使用姿势

大家好&#xff0c;我是码农先森。 变量 在 PHP 语言中&#xff0c;初始化变量虽然只有一行&#xff0c;其实包含了两步&#xff0c;一是声明变量&#xff0c;二是赋值给变量&#xff0c;同一个变量可以任意再赋值任何类型的数据。 <?php// 初始化变量 $name "man…

[linux] 系统的基本使用

用户系统&#xff1a; 之前提到&#xff0c;linux是个多用户系统&#xff0c;所以要使用linux&#xff0c;首先你得是个用户 用户&#xff1a;普通用户管理员 每一个用户有自己的用户名密码&#xff0c; 会话(session):一个终端使用服务器的全过程 从你用户登录&#xff0c;到你…

Java 读取Excel导入数据库,形成树状结构

最近开发过程中遇到一个Excel的导入的功能,因为导入的数据结构具有层次结构,经过一番研究,最终得以实现,所有写下该文章,记录过程,供以后参考。 下图是导入Excel的数据结构: 使用POI解析Excel,数据封装然后进行入库。下面是核心代码。 @Overridepublic KnowledgeBase…