引用初始化、左值右值、函数数组参数

C++引用(变量引用、数组引用与数组指针、引用本质-指针常量、常量引用) 文章目录1 引用的基本用法2 引用注意事项3 引用做函数参数4 引用做函数返回值5 引用的本质6 常量引用 1 引用的基本用法 作用:为变量起别名。 语法:数据类型 &别名 = 原名; 示例: int main() { int a = 5; int &b = a; //引用:为变量起别名 cout << "a = " << a << endl; //5 cout << "b = " << b << endl; 阅读详情

l-value 与 r-value 区别
左值是引用某个对象的表达式,就是可以放在赋值左边的东西,如:*(p+1)=7, 没有名字的变量(*(p+1)表达式一定是一个类型的对象)被赋值了,但左值并不一定能被赋值,因为左值可以引用某个常量。 所有的引用都是左值。
右值是表达式的值(不是引用),可以放在赋值右面。
所有的左值都可以是右值,反之不成立
  int i, j, *p;
  i = 7;           // Correct. A variable name, i, is an l-value.
  7 = i;           // ERROR.  A constant, 7, is an r-value.
  j * 4 = 7;       // ERROR.  The expression j * 4 yields an r-value.
  *p = i;          //   A dereferenced pointer is an l-value.
  const int ci = 7; //  Declare a const variable.
  ci = 9;          // ERROR. ci is a nonmodifiable l-value


普通引用和const引用的初始化
    当引用的初始式是一个左值(是一个对象,你可以取得他的地址)时,其初始化就是非常简单的事情。普通T&的初始式必须是一个T类型的。而cosnt T&则不必是一个左值,甚至可以不是T类型的。在这样的情况下,经过以下几个步骤。
    (1)首先,如果需要的话,将应用到类型T的隐式类型转换。
    (2)而后,将结果存入一个类型T的临时变量。
    (3)最后,将此临时变量用作初始化的值。
例如
double& d=1;  //错误,d是左值,不能用右值1 来初始化
const double& cd=1;  //ok

对后一个初始化的解释是:
double temp=double(1);  //首先建立一个具有正确数据类型的临时变量
const double& cd=temp;  //而后用这个临时变量作为cd的初始式,temp是个右值
 
由于左值的一大特点是可以对其赋值,而const正好将这个特点给阉割了,使该表达式成为了一个右值,所以可以用右值来初始化。

 

===7.3.1引用参数===
函数的引用参数
把参数声明成引用,实际上改变了缺省的按值传递参数的传递机制。在按值传递时,函数操纵的是实参的本地拷贝。当参数是引用时,函数接收的是实参的左值而不是值的拷贝。
这意味着函数知道实参在内存中的位置,因而能够改变它的值或取它的地址。
int obj;
void frd( double & );
int main()
{
    frd( obj ); // 错误: 参数必须是 const double &
    return 0;
}
对frd()的调用是错误的.实参类型是int 必须被转换成double 以匹配引用参数的类型,
该转换的结果是个临时值,因为这种引用不是const 型的,所以临时值(不是左值)不能被用来初始化该引用


什么时候将一个参数指定为引用比较合:
1、允许改变实参的值
2、向主调函数返回额外的结果
3、向函数传递大型类对象

使用指针还是引用作为参数的一个重要区分:
引用必须被初始化为指向一个对象,一旦初始化了,它就不能再指向其他对象,而指针可以指向一系列不同的对象也可以什么都不指向
所以,如果一个参数可能在函数中指向不同的对象,或者这个参数可能不指向任何对象,则必须使用指针参数

 

===7.3.3 数组参数===
在C++中数组永远不会按值传递它是传递第一个元素(准确地说是第0 个)的指针
如下声明
    void putValues( int[ 10 ] ); //当编译器对实参类型进行参数类型检查时,并不检查数组的长度,编泽器忽略10
被编译器视为
    void putValues( int* );
数组的长度与参数声明无关,因此下列三个声明是等价的
// 三个等价的putValues()声明
void putValues( int* );
void putValues( int[] );
void putValues( int[ 10 ] );

传递数组长度的三种机制
1、提供一个含有数组长度的额外参数:void putValues( int[], int size );
2、将参数声明为数组的引用:void putValues( int (&arr)[10] );
当参数是一个数组类型的引用时,数组长度成为参数和实参类型的一部分,编译器检查数组实参的长度与在函数参数类型中指定的长度是否匹配
// 参数为10 个int 的数组
// parameter is a reference to an array of 10 ints
void putValues( int (&arr)[10] );//只接受10 个int的数组
int main() {
    int i, j[ 2 ];
    putValues( i ); // 错误: 实参不是 10 个 int 的数组
    putValues( j ); // 错误: 实参不是 10 个 int 的数组
    return 0;
}

3、使用抽象容器
void putValues(const vector<int> &vec );

 

C11 列表初始化、左/右值引用、移动语义、可变参数模版 阅读详情

相关推荐

C++ 如何引用结构体数组作为函数形参

最近使用VS2008编写程序时,遇到了如何引用结构体数组作为函数形参问题。 现将主要代码粘贴如下(结果如图所示),来达到传递结构体数组到函数中的目的: ////--main.cpp--///// #include "Point.h"#include#include using namespace std;typedef struct      //定义结构体 { int num

mile_999的专栏 1万+

mssqlserver分区表的左值与右值

参考官方文档: https://docs.microsoft.com/zh-cn/sql/t-sql/statements/create-partition-function-transact-sql 默认是Left LEFT:第一个值属于第一个表,对应&lt;= RIGTH: 第一个值属于第二个表,对应&lt; 如果数据按年进行分区,则RIGHT选项且每年的1月1日是合适的。如: C...

weixin_34004750的博客 165

c++第五章(一维数组,二维数组的定义,引用和初始化的注意事项和用法详解,数组的遍历以及数组作为函数参数的例子等等)

c++第五章 宝藏教程!!!(一维数组,二维数组的定义,引用和初始化的注意事项和用法详解,数组的遍历以及数组作为函数参数的例子等等)

weixin_54201821的博客 1538

C++左值引用

c++左值引用 1.左值引用是什么 左值引用是一个变量的别名 2.左值引用声明 <类型名> &引用名= 被引用对象;必须在声明的时候初始化,一旦初始化,就不可以引用其他变量 原因: int a = 3; int b = 5; int &c = a;//引用c指向a,或者说c引用了a 注意下面的语句: c = b; 将b的值赋给c引用的...

qq2071114140的博客 718

转录组测序(RNA-seq)的数据如何分析?

经过富集分析后,我们就可以从富集到的GO term或者Pathway中寻找关键基因,通过一个GO term和Pathway里面的基因往往小于100个,至此我们就又将上千条基因的范围缩小到了100条以内。对GO term或者Pathway里面的基因进行范围的缩小也有两个方法,一种方法是根据基因的注释或者文献来找到GO term或者Pathway里面的关键基因(2-3个),另一种方法需要有相应的表型数据,与GO term或者Pathway里面基因进行相关性分析,找出与表型高度相关的基因。

weixin_55372631的博客 1万+

一步一步教你写股票走势图——K线图一(概述)

股票分时图部分已经开发完毕,受到了广大开发者的好评!界面、功能都挺完美,解决了好一些MP开发者的问题,博主甚是欣悦,更有动力去开源K线图。这里说一下,如果有问题直接留言或者发邮件,github上个人信息有邮件,我看到基本都会回复,博主不加qq的,体谅O(∩_∩)O。分析好了,废话不多说,我们分析下K线图吧,首先我们看下自选股K线图的效果吧效果还是很赞的,经过分时图的研究后,博主越来越确信自选股用的应

体验Android编程之美 3万+

C++引用(常量引用、左值引用和右值引用)

引用为对象起了另外一个名字,引用类型为引用另外一种类型。通过将声明符写成&d的形式来定义引用类型,其中d是声明的变量名: 一般在初始化变量的时候,初始值会被拷贝到新建的对象中。然而定义引用的时候,程序把引用和它的初始值**绑定(bind)**在一起,而不是将初始值拷贝给引用。一旦初始化完成,引用将和它的初始值对象一直绑定在一起。因为无法令引用重新绑定到另外一个对象,因此引用必须初始化。引用即别名引用并非对象,相反的,它只是为一个已经存在的对象所起的另外一个名字定义了一个引用之后,对其进行的所有操作都是在与之

m0_69251699的博客 710

基于 MATLAB 的综合能源系统建模:全面解析与案例应用 

本文详细介绍了基于 MATLAB 的综合能源系统建模相关知识,包括 MATLAB 在综合能源建模中的优势、综合能源系统各组件和网络的建模方法,并通过园区综合能源系统的案例展示了从建模到优化调度求解以及结果分析的全过程。在当今全球能源格局深刻变革的背景下,综合能源系统(Integrated Energy System,IES)作为一种创新的能源供应体系,整合了多种能源形式,如电力、热力、燃气等,以实现能源的高效生产、传输、分配和利用。需要考虑燃气的压力、流量特性以及管道的阻力特性等。

qq_57128262的博客 1336

C++类中引用成员和常量成员的初始化(初始化列表)

如果一个类是这样定义的: Class A { public: A(int pram1, int pram2, int pram3); privite: int a; int &b; const int c; } 假如在构造函数中对三个私有变量进行赋值则通常会这样写: A::A(int pram1, int pram2, int pram3) { a=pram1; b=pram2

skysys的研究小屋 2135

用 XCO_CP_XLSX 在 ABAP 中写 Excel:从写入访问到样式控制的完整指南

本文介绍了在 ABAP 环境中使用 XCO_CP_XLSX 模块导出 Excel 报表的完整实践方案。文章从获取写入访问权限开始,详细讲解了基于 row_stream 的批量数据写入和基于 cursor 的精细控制两种方法,并提供了创建新文档、添加工作表、设置样式等关键操作示例。通过分层抽象的工作簿-工作表-单元格模型,开发者可以灵活应对企业应用中常见的报表导出需求,特别是在 SAP BTP 和 S/4HANA Cloud 环境下实现高效可靠的 Excel 文件生成与处理。

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 164

【RT-DETR实战】117、华为昇腾CANN部署探索:从模型转换到推理踩坑实录

本文总结了RT-DETR模型在昇腾310B芯片上部署的关键挑战与解决方案。主要遇到四大问题:1)模型转换时需注意ONNX导出设置,建议先固定尺寸验证;2)内存布局差异导致推理异常,需精确匹配NHWC/NCHW格式;3)流水线并发优化中内存复用和异步处理是关键;4)调试阶段需利用专用工具逐层比对。作者提出六条实用建议,包括小尺寸验证、预处理对齐、内存池设计等,强调部署是持续适配过程,需建立完整的测试体系应对工具链迭代。

企鹅码农的专属播客,分享10多年的实战案例和经验解读,包含YOLO、RT-DETR、AI等各个工作领域。 192

C++笔记四(右值引用)

可以对表达式取地址(&)的就是左值,否则为右值被声明出来的左值引用和右值引用都是左值,因为被声明出来出来的的左值引用和右值引用都是有地址的。是为了转移对象的所有权,其功能是把左值强制转换为右值单纯的不会有性能提升。移动语义就是为了减少拷贝std::move将左值转为右值引用,这样就可以重载到移动构造函数了,移动构造函数将指针赋值一下就好了,不用深拷贝了,提高性能。万能引用:函数模板,既可以接左值引用,也可以接右值引用,但当一个右值作为参数进行传参时,相应函数接口在接收该值时,会将该值识别成左值。

nanjono的博客 1268

【Mini KITTI】KITTI数据集简介 — Mini KITTI

为了快速进行算法调试、训练、评估和验证,以及快速下载,制作了一个mini kitti数据集,数据集的文件目录结构与完整KITTI数据集保持一致。其中,小型的KITTI数据集,即 mini kitti保存了20个训练样本和5个测试样本。下载地址为:。 关于KITTI各个部分的介绍请分别参考以下内容: ...

叶子的博客 7537

【C++移动语义与完美转发】左值右值,引用,引用折叠,移动语义,万能引用与完美转发

本节我们讲解了C++左值右值,引用,引用折叠,移动语义,万能引用与完美转发

m0_73800387的博客 1532

[AI8051U入门第一步]环境安装和按键控制流水灯

本文介绍了AI8051U单片机的开发环境搭建及GPIO应用。主要内容包括:1)通过ISP软件完成Keil开发环境配置;2)AI8051U特性介绍,包括32位8051内核、浮点运算单元及丰富外设;3)GPIO输入输出模式解析,并附流水灯控制代码;4)提供完整的系统初始化、延时函数及LED控制代码实现。文章配套资源包含完整工程代码,适用于智能硬件及物联网开发。

sinat_58149788的博客 671

Python 爬虫教程:财经新闻实时抓取(最新资讯 + 关键词提取)

在当今信息爆炸的时代,财经新闻的实时获取对于投资者、研究人员以及普通大众来说都具有重要的价值。通过 Python 爬虫技术,我们可以高效地抓取财经新闻,并提取其中的关键信息,以便更好地进行数据分析和决策支持。本文将详细介绍如何使用 Python 编写一个财经新闻实时抓取系统,并结合关键词提取技术,帮助读者快速掌握 Python 爬虫的核心技能。

yansideyucsdn的博客 1049

【C++】对左值引用&右值引用&&的深入理解(右值引用与移动语义)

在区分左右值引用之前,我先补充一下对引用的理解。引用,我们需要了解的是,为什么C语言没有引用,而C++有呢?在C语言中,设计者希望语言保持简单并且支持直接操作内存,因此选择使用指针完成数据的传递,通过指针,C语言可以实现对变量的直接访问和修改;在C++中,引入了更高级抽象机制,引用作为一种高级抽象比指针更安全、易用,并且在实现参数传递和返回值时不需要&、*操作符,更符合直观语义,便于面向对象编程。

谁在夜里看海.的博客 8698

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

C++ 引用与引用作为函数的参数

对一个数据建立一个“引用”,他的作用是为一个变量起一个别名。这是C++对C语言的一个重要补充。 如何建立一个引用 int a = 5; int &b = a; cout<<a<<endl; cout<<b<<endl; cout<<&a<<endl; cou...

朋朋の优快云博客 6009

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

C语言-数组的定义和引用

数组的定义和引用1. 一维数组、二维数组的定义、初始化和引用方法数组数据的特点:数组:一般形式:类型说明符 数组名[常量表达式];说明:一维数组的引用1. 引用方式:二维数组二维数组引用表现形式:引用四种方法对二维数组初始化2.一维数组的应用(如排序),二维数组的应用(如矩阵运算)3.数组作函数参数4.字符数组的定义、初始化和输入输出方法5.字符串与字符串处理函数的使用 1. 一维数组、二维数组的定义、初始化和引用方法 数组数据的特点: 具有相同的数据类型 使用过程中需要保留原始数据 数组: 是一种具

努力的程序员 1万+

C++拾遗--引用(左值引用、右值引用)

C++拾遗--引用 前言 引用就是别名(alias)。所谓别名,就是对已存在的对象另起一个名字。本身含义并不难理解,但与其它概念一组合,就成了使用难点。再加上新标准提出了新的一种引用-右值引用,引用这一概念就变得更加难以理解和使用。 正文 随着新标准(新标准往往就是新的技术)的提出,引用这一概念分成两类:左值引用、右值引用。其中左值引用是最常用的一种,而右值引用则是语言使用上的一种革新。 1.左值引用 左值引用的基本语法 Type &引用名 = 左值表达式;

CCPP Blog 4590

【c++11】c++11新特性(上)(列表初始化、右值引用和移动语义、类的新默认成员函数、lambda表达式)

本篇文章,我们主要学习了c++11的部分新特性:列表初始化、右值引用、类的新默认成员函数和lambda表达式。通过剖析引用折叠、完美转发等底层机制,lambda的多种捕捉方式与适用场景,希望能帮助大家在资源管理、代码简洁性及性能提升之间找到平衡。之后博主会和大家分享c++11其他的新特性,如可变参数模板、包装器、智能指针等。

2301_80955819的博客 1935

C++中数组作为函数参数的注意问题

C++中数组作为函数参数的注意问题 1 问题引入 从《剑指Offer》上的相关问题,下面的输出是什么? #include<iostream> using namespace std; int GetSize(int data[]) { return sizeof(data); } int main() { int data1[] = {1,2,3,4,5}; int size1 = sizeof(data1); int *data2 = data1;

zou_albert的博客 5983

C++11:列表初始化,理解左值右值, 右值引用和移动语义,类型分类

C++11:列表初始化,理解左值右值, 右值引用和移动语义,类型分类

2401_88433210的博客 722

C++11 列表初始化和左值右值

C++11引入了多项重要更新,主要包括列表初始化和右值引用两大特性。列表初始化扩展了{}初始化方式,支持内置类型和自定义类型的直接初始化,并引入initializer_list机制。右值引用通过区分左值/右值,实现了移动语义,避免不必要的拷贝开销。移动构造和移动赋值通过"窃取"临时对象资源提高效率,完美配合传值返回场景。此外,引用折叠规则支持万能引用,结合完美转发可保持参数原始类型特性。这些改进显著提升了C++在处理临时对象和资源管理时的性能表现。

2301_79976271的博客 759

什么是引用?函数传递参数的三种方式

1.什么是引用? https://www.cnblogs.com/duwenxing/p/7421100.html 前言:引用是C++一个很重要的特性,最近看了很多有关引用的资料和博客,故在此对引用的相关知识进行总结 一、什么是引用 引用,顾名思义是某一个变量或对象的别名,对引用的操作与对其所绑定的变量或对象的操作完全等价 语法:类型 &引用名=目标变量名; 特别...

weixin_40710375的博客 1万+
上一篇: C++ primer 摘要《函数模板》20090120
下一篇: C++ primer 摘要《异常处理》20090122
geeeeeeee
博客等级 码龄23年 36粉丝 67原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值