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

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

【影像组学入门百问】1#---#3

理论上讲三大主流平台Windows, Linux和MacOS均可进行影像组学研究。根据笔者实际经验,如果内存不足可能导致软件罢工,其余显示、GPU等均非必要。显示:最小分辨率为1024×768(推荐为1280×1024或更好)。Slicer中的许多计算都是多线程的,并且将受益于多核,多CPU配置。计算机需要足够的内存和图形功能将原始数据和处理结果保存在其内存中。如涉及深度学习等方法的研究需根据实际需求配置电脑,无法一概而论。接口设备:推荐使用带滚轮的三键鼠标。内存:超过4GB(推荐8G以上)。

weixin_38594676的博客 1484

HALCON卡尺模型实战:5分钟搞定工件尺寸测量(附完整代码)

本文详细介绍了HALCON卡尺模型在工件尺寸测量中的实战应用,通过5分钟快速搭建测量系统的完整指南,包括基础配置、高级参数调优和完整代码示例。卡尺模型能自动识别边缘并计算精确尺寸,显著提升工业视觉检测的效率和一致性,特别适用于实时测量场景。

weixin_42570296的博客 463

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

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

m0_69251699的博客 710

ADC(三)Guard ring的设计艺术:从单元到系统的隔离策略

本文深入探讨了ADC设计中Guard ring(保护环)从单元到系统的多层次隔离策略。文章分享了从新手到专家的认知升级过程,详细分析了在单元内部进行微隔离、在模块间建立噪声屏障以及在系统层面规划全局隔离带的实用方法与设计艺术,强调了Guard ring对于提升混合信号电路性能和可靠性的关键作用。

weixin_28312391的博客 153

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

别再手动调波形了!用STM32G474的HRTIM+DAC生成精密锯齿波,附完整CubeMX配置

本文详细介绍了如何利用STM32G474的高分辨率定时器(HRTIM)和数模转换器(DAC)协同工作,实现高精度锯齿波生成。通过CubeMX配置指南、关键寄存器计算和实践技巧,帮助开发者快速掌握全硬件实现的波形生成方案,显著提升嵌入式系统的波形控制精度和响应速度。

weixin_28716769的博客 246

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

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

nanjono的博客 1268

自制非接触式静电探测仪:从振动电容原理到微弱信号检测实践

微弱信号检测是电子测量领域的核心挑战之一,尤其在需要避免物理接触或防止干扰的场景中。其基本原理在于将难以直接获取的微小物理量(如电流、电压)通过传感器转换为电信号,再经过放大、滤波等处理进行提取。锁相放大技术是解决这一问题的关键手段,它利用参考信号与目标信号的同步性,从强噪声背景中恢复出有效信息,极大提升了信噪比和测量灵敏度。这项技术的工程价值在于实现了对纳安级电流、微伏级电压等高难度参数的可靠测量。在静电防护、材料表面电位分析、生物电信号采集等应用场景中,非接触式测量需求广泛。本文聚焦的基于振动电容原理的

weixin_32349093的博客 274

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

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

m0_73800387的博客 1532

OWASP 2025版AI大模型攻击安全风险汇总(攻击方法种类)

提示词注入是大模型最基础、最常见的核心漏洞,攻击者通过构造直接或间接的恶意自然语言输入,篡改大模型原本的正常行为与输出结果。哪怕这类恶意内容对人类是隐藏、不可见的,只要模型能够正常解析读取,就会触发漏洞。它和大家常说的模型“越狱”相关,但并不等同:越狱是提示词注入的极端形式,会直接让模型彻底无视所有内置安全协议,完全脱离管控;而普通提示词注入,更多是针对性篡改模型行为、诱导执行特定操作。

墨痕诉清风的博客 518

智能化教育改革中的教师角色转变:AI应用架构师如何设计“人机协同”系统?

个性化与规模化的矛盾:如何用AI实现规模化的个性化学习,同时保留教师的“人文温度”?自动化与自主性的矛盾:如何用AI自动化流程(如批改),同时避免教师沦为“AI操作工人”?数据驱动与经验驱动的矛盾:如何平衡AI的“数据决策”与教师的“经验决策”,避免“算法偏见”或“经验固化”?在智能化教育改革中,教师始终是教育的核心——AI系统是“辅助工具”,而非“替代者”。

小白菜的博客 1269

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

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

谁在夜里看海.的博客 8698

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

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

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

朋朋の优快云博客 6009

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

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

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

努力的程序员 1万+

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

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、付费专栏及课程。

余额充值