C++引用初始化和赋值

cvtColor +内存泄漏 题目不知道怎么取,因为cvtColor并没有产生内存泄漏,但是我由于没有正确使用cvtColor而出现了内存泄漏的问题,所以暂且以cvtColor+内存泄漏为题 1.应用背景 项目中用到cvtColor的地方是需要将灰度图转为3通道的彩色图(实际上转换后仍然为灰色的,但是电脑认为的是3通道的彩色图了) 因此需要用到以下语句 cvtColor(src_img, cvMtxRGB, C 阅读详情

C++引用两大核心规则完整理解

一、两条规则原文

  1. 引用定义时必须立刻初始化,不存在“空引用”;
  2. 引用一旦绑定某个变量,终身不能改绑到其他变量。

先记住底层本质:引用本质是变量的别名,不是独立变量。
指针是独立变量,存地址;引用只是给已有变量多起一个名字,没有自己独立内存。


1. 规则1:引用必须初始化

错误示范

int& r; // 编译报错!

原因:引用是别名,你声明了别名,但没说它是谁的别名,编译器不知道它绑定哪个变量,非法。

正确写法

int a = 10;
int& r = a; // 定义同时绑定a,r就是a的别名

延伸:能绑定什么?

  1. 左值变量(普通变量):最常用
double d = 3.14;
double& rd = d;
  1. const引用可以绑定常量/临时值
const int& cr = 100; // 合法,const引用特殊规则
int& r = 100;        // 报错:普通引用不能绑临时常量

对比指针(反衬引用特性)

指针可以先定义、后赋值,允许空:

int* p;    // 合法,野指针
p = &a;    // 后面再赋值
int* p2 = nullptr; // 空指针合法

引用没有这个自由度,天生不能空。


2. 规则2:绑定后不能重新指向别的变量

代码演示,分清「赋值」和「改绑定」

int a = 10;
int b = 20;
int& r = a; // r是a别名

r = b;      // ❗不是把r改成b的别名!只是赋值操作

关键拆解 r = b;

  • r 永远是 a 的别名;
  • r = b 等价于 a = b;
  • 执行后:a 的值变成20,r 依旧绑定 a,没有换目标。

证明无法改绑

int a=10, b=20;
int& r = a;
cout << &r << " " << &a << endl; // 地址完全相同

r = b;
cout << &r << " " << &a << endl; // 地址没变,还是a的地址

地址不变,说明绑定关系终身不变。

再对比指针(指针可以随意改指向)

int a=10, b=20;
int* p = &a;
p = &b; // 完全合法,指针直接改存的地址,指向b

指针是独立变量,存地址,内容可改;
引用是别名,绑定关系写死,只能修改绑定对象的值。


3. 通俗生活化理解

比喻:人 & 外号(引用=外号)

变量 = 真人张三;
引用 = 外号“小张”。

  1. 必须初始化
    不能凭空创造一个外号“小张”,必须先有真人张三,才能给张三起外号;
    不存在没有对应真人的外号(不存在无初始化引用)。

  2. 外号不能换人
    “小张”这个外号一旦给了张三,永远指代张三;
    你写一句“小张=李四”,不是把外号转给李四,只是让张三复制李四的属性,外号还是张三的。

指针比喻:纸条写人名

指针是一张纸条,上面写人的地址:

  • 纸条可以空白、可以后面改写地址、可以换写别人地址;
    和引用(外号)完全两套逻辑。

4. 常见易错场景总结

场景1:误以为赋值会改引用指向

int x=1, y=2;
int& ref = x;
ref = y;
// 错误认知:ref现在绑定y
// 真相:x = y,ref依旧绑定x

场景2:函数引用参数也遵循该规则

void func(int& r) {
    int b = 99;
    r = b; // 只是修改外部实参的值,不能让r绑定b
}

场景3:数组不能有引用数组,但数组元素可以是引用

int a=1,b=2;
int& arr[] = {a,b}; // 报错,引用数组非法(底层绑定不可变更)
int* parr[] = {&a,&b}; // 指针数组合法

场景4:const引用强化不可修改绑定

int m = 5;
const int& cr = m;
cr = 10; // 报错:连绑定对象的值都不能改,绑定更不可能换

5. 一句话精炼总结

  1. 引用是已有变量的别名,创建时必须指定给谁起别名,所以必须初始化;
  2. 别名和原变量终身绑定,赋值只会修改原变量的值,不会更换别名归属,因此不能重新绑定其他变量。
3D视觉实战之双目相机物体尺寸实时测量 视差图滤波能够将稀疏视差转变为稠密视差,并在一定程度上降低视差图噪声,改善视差图的视觉效果,但是比较依赖初始视差图的质量。的目标是获得左右两个相机的内参、外参和畸变系数,其中内参包括左右相机的fx,fy,cx,cy,外参包括左相机相对于右相机的旋转矩阵和平移向量,畸变系数包括径向畸变系数(k1, k2,k3)和切向畸变系数(p1,p2)以及其他一些畸变类型。:相比于昂贵的专业设备,便宜的双目摄像头可以显著降低成本,使得实时点云生成技术更加普及和经济实惠。 阅读详情

相关推荐

XGBoost特征重要性为0的问题:深度解析与应对策略

在机器学习领域,XGBoost(Extreme Gradient Boosting)作为一款高效且强大的集成学习算法,已经被广泛应用于各类预测任务中。然而,在实际应用过程中,许多数据科学家和工程师们遇到了一个令人困惑的现象——某些特征的重要性值为0。这不仅影响了模型的解释性,还可能导致特征选择过程中的误判。本文将深入探讨这一问题,分析其背后的原因,并提供相应的解决方案。在深入探讨特征重要性为0的问题之前,我们首先需要了解XGBoost是如何计算特征重要性的。XGBoost提供了三种常见的特征重要性计算方法:

cda2024的博客 1706

Linux/C++系统编程 day3

C++应用方向 C++头文件都是模板编写,没有.h,而模板有一个特点必须知道所有实现之后才能进行正常编译 (cd /usr/include/c++) 函数声明和定义 (形式上区别,花括号和末尾分号 声明可以有多次,定义只能有一次) <<输出流运算符,左移乘2 endl换行 >>输入流运算符,右移除2 同窗口无法编译运行 vimplus中可使用gcc注释一行,u还原或者再按一次 运算符重载,视作函数 命名空间 为什么要使用命名空间? 解决函数命名冲突

hudy_的博客 235

YF-S401水流量传感器在STM32上的精准计量实现

本文详细介绍了YF-S401水流量传感器与STM32微控制器的集成应用,实现精准水流计量。通过外部中断和外部时钟两种脉冲计数方案,结合硬件配置、软件滤波和校准技巧,确保高精度流量测量。适用于智能家居和工业自动化中的水控系统,提升系统稳定性和测量准确性。

rainy的博客 897

C++字符数组(定义和初始化、赋值和引用)

用来存放字符数据的数组是字符数组,字符数组中的一个元素存放一个字符。字符数组具有数组的共同属性。由于字符串应用广泛,C和C++专门为它提供了许多方便的用法和函数。 一、字符数组的定义和初始化 定义字符数组的方法与前面介绍的类似。例如 char c[10]; c[0]=′I′;c[1]=′ ′;c[2]=′a′;c[3]=′m′;c[4]=′ ′;c[5]=′h′;c[6]=′a′;c[

一个人,在路上 2万+

Cisco 路由器 打环测试教程

环 回测试是很常用的一种测试,通常用于检查和分析端口或线路问题。如下图所示,我们在设备端口上用命令loopback(某些端口上命令格式为 loopback diagnostic)使接口从内部将自己发送的信号转接到自己的接收端(如红线所示),通过检查数据发送和接收的情况来判断端口工作状态是否正常。如果 需要对端口进行完全的检测,可以使用符合标准的短跳线将端口收发短接构成环...

weixin_34304013的博客 2024

逆向Shopee签名机制:从参数分析到稳定采集方案

本文深入解析了Shopee签名机制的逆向过程,从参数分析到稳定采集方案的实现。通过抓包定位关键参数`sap-ri`和`x-sap-sec`,还原了签名生成算法,并提供了Python实现代码。文章还分享了反反爬策略、性能优化技巧及长期维护建议,帮助开发者构建稳定的Shopee数据采集方案。

weixin_27722377的博客 678

c++数组的引用

引用就是某一变量(目标)的一个别名,对引用的操作与对变量直接操作完全一样。引用的声明方法:类型标识符 &引用名=目标变量名; 引用最大的好处就是提高函数效率以及节省空间; 关键问题一、传递引用与传指针、传值的区别? 值传递 (pass by value),指针传递(pass by pointer),当发生函数调用时,需要给形参分配存储单元、当传递是对象时,要调用拷...

weixin_30438813的博客 1664

MATLAB AppDesigner 中TextArea保留原有信息并换行显示提示信息

App Designer 中的文本区域TextArea组件,一般可以用来作为matlab app设计中的信息显示。 app.TextArea.Value = 'Hello Matlab'; Value可以是字符向量、字符向量元胞数组、字符串数组或一维分类数组。这样直接给TextArea赋值,每次赋值都会消除先前的信息,然后显示新的信息。如果想要在app实现保留原有信息、多行信息的输出,在MathWorks官方帮助中心给出了一种方法: cellArrayText{1} = sprintf('%s\n

我是麻瓜喔的博客 1万+

C++字符数组 定义和初始化 赋值和引用

C++字符数组 定义和初始化 赋值和引用

hhduyc的博客 4840

基于 STM32 设计的 HC05 蓝牙音箱

本项目介绍如何使用 STM32 微控制器和 HC05 蓝牙模块设计一个简单的蓝牙音箱。该音箱可以接收来自手机或其他蓝牙设备的音频数据,并通过扬声器播放。该项目展示了如何使用 STM32 微控制器和 HC05 蓝牙模块设计一个简单的蓝牙音箱。易于实现功能实用可扩展性强如果您需要开发一个蓝牙音箱,该项目可以作为参考。

走向CTO的路上... 2473

ThingsBoard教程(十六):RPC部件的使用

前言 各位读者好,截止目前,ThingsBoard系列文章已经做了十篇,分别是 ThingsBoard教程(一):ThingBoard介绍及安装 ThingsBoard教程(二):租户,租户配置,部件组模块的使用 ThingsBoard教程(三):系统设置模块的使用 ThingsBoard教程(四):规则链简介与操作 ThingsBoard教程(五):客户,资产管理 ThingsBoard教程(六):设备管理 ThingsBoard教程(七):模拟设备遥测 ThingsBoard教程(八):自定义UI T

知无涯 4584

C++ 右值引用初始化和赋值

C++ 右值引用初始化和赋值

nihao_2014的博客 621

java项目反编译工具记录,共计6个工具

java项目反编译工具记录,共计6个工具

橙-极纪元-JJYCheng 1802

C++的const和引用只能在初始化列表里初始化而不能在构造函数体内赋值初始化

class ConstRef{ public: ConstRef( int ii ); private: int i; const int ci; int &ri; }; ConstRef::ConstRef( int ii ){ i = ii; ci = ii; ri = i; } ConstRef::ConstRef( int ii ): i(ii), ci(ii), ri(

优快云 3917

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

c++ 后面的冒号--运算赋值与括号赋值的讲解--const和引用必须初始化赋值的原因

http://blog.youkuaiyun.com/kaixinbingju/article/details/9094289构造函数后加冒号是初始化表达式:有四种情况下应该使用初始化表达式来初始化成员:1:初始化const成员2:初始化引用成员3:当调用基类的构造函数,而它拥有一组参数时4:当调用成员类的构造函数,而它拥有一组参数时。在程序中定义变量并初始化的机制中,有两种形式,一个是我们传统的初始化的形式...

u010029439的博客 2915

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

《C++ Primer 第五版》第二章(1-4小节)------基本内置类型,初始化和赋值及声明和定义,指针和引用,const和constexpr

C++ Primer第二章的内容主要介绍了变量和基础类型,包括C++语言定义的基础内置类型、变量的定义及声明、符合类型如指针及引用的介绍和const及常量表达式constexpr的介绍,本次博客也从这四个方面进行系统的介绍,如果有不足之处,还望其他博主留言指正;如果博客对你有一定的帮助,还请点个赞支持一下。 1)基本内置类型 C++语言具有广泛的数据类型,除...

xx18030637774的博客 371

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

指针、引用、解引用简单使用总结

空间占用和操作:引用在内部实现上通常被视为指针的语法糖,因此引用没有自己的独立存储空间,而指针本身需要分配存储空间来存储地址。此外,由于引用被看作是变量的别名,可以直接使用引用来访问变量,不需要解引用操作符 *,而指针需要通过解引用操作符来访问所指向的对象。而引用必须始终引用一个有效的对象,它不能指向空值。而引用一旦被初始化后,就无法再引用其他对象,它始终指向初始化时所引用的对象。修改指针指向的对象:通过解引用可以修改指针指向的实际对象的值。访问指针指向的对象:通过解引用可以访问指针指向的实际对象。

面条有点辣 2533

C++赋值和初始化的区别

C++中对变量的操作有很多,比如赋值、初始化等。很多人都会把赋值和初始化混为一谈,下面我们就来研究一下赋值和初始化的区别。先上结论: 初始化 赋值 在变量生命周期中只能进行一次 可以无限次数进行 任何类型的变量都必须初始化(基本类型无初值也可以视为调用默认构造函数,而对象必须调用构造函数进行初始化,无构造函数会调用默认构造函数,有构造函数必须调用其中一个,调用无参构造函数时可以省略括号,这也算初始化) 可有可无 必须在声明时紧跟在变量名后 可以在变量生命周期中的任何位置 在类的构

[PE]经典八炮的博客 2484

C++有哪几种情况只能用初始化列表,而不能用赋值?

C++有哪几种情况只能用初始化列表,而不能用赋值? (1)对于const和reference类型成员变量,它们只能够被初始化而不能做赋值操作,因此只能用初始化列表; 初始化与赋值是不同的: 赋值是删除原值,赋予新值,构造函数的意思是先开辟空间然后为其赋值,只能算是赋值,不算初始化; 初始化列表就不一样了,开辟空间和初始化是同时完成的,直接给予一个值; 常量不能被赋值,

知行天下 1124

C++的引用 拷贝赋值和引用赋值

引用是C++里面才有的概念。引用并不是定义了一个新的变量,它只是为一个现存变量起的别名。例如: k就是i的一个别名。定义引用需要注意的地方:来看几个错误的例子巩固一下: 但是可以在一条语句中定义多个引用。例如: 拷贝赋值和引用赋值 其实就类似于传值和传址的区别。下面来具体看两个代码: 运行结果: 运行结果: 第一个是拷贝赋值,第二个是引用赋值。总之一句话,引用即别名。引用并没有创建一个新的变量,只是对原有的变量起了一个新的名字。

陈大大陈的博客 1069

深入探索c++构造函数之二:参数化列表初始化与赋值的区别

1、初始化与赋值的区别 我们在定义变量时习惯于对其立即进行初始化,有时候也会先定义再赋值。由于赋值与初始化都是通过“=”来完成的,以至于很多时候我们忽略了二者的去呗,实际上这二者时候很大区别的。 string foo="Hello World";//定义并进行初始化 string bar; //默认初始化为空的string对象 bar="Hello World"; //为bar赋值 //const修饰的变量、引用定义时必须进行初始化,不能赋值 const int a=3

weixin_43354152的博客 4246

C++11详解(一) -- 列表初始化,右值引用和移动语义

1. 需要注意的是在vs2019的release和vs2022的debug和release,下面代码会进一步优化,直接构造要返回的临时对象,str本质是临时对象的引用,底层角度用指针实现。2. 需要注意的是在vs2019的release和vs2022的debug和release,会直接将str对象的构造,str移动构造临时对象,临时对象移动构造ret对象,合三为一,变为直接构造。的成员变量的类,移动构造和移动赋值才有意义,因为移动构造和移动赋值的第一个参数都是右值引用的类型,

的博客 994

【C++11】列表初始化、右值引用和移动语义、引用折叠、完美转发

列表初始化、右值引用和移动语义、引用折叠、完美转发

2203_76003626的博客 1182

C++引用的定义和使用

引用的定义和使用 在C++中,变量的“引用”就是变量的别名,因此,“引用”又称为“别名”。建立“引用”的作用就是为一个变量起另一个名字,以便在需要的时候,可以方便、间接地引用该变量,这就是“引用”名称的由来。对一个变量的“引用”的所有操作,实际上,都是对其所代表的(原来的)变量的操作。 定义一个引用,有如下的格式: 数据类型名 &引用名称 = 被引用的对象; 在数据类型名后面,使用引用符合“&”,然后,接着引用的名称。最后,给引用设置引用的对象。 假设有...

LC的专栏 5623

C++11的列表初始化和右值引用

C++11相较于之C++98,能更好地用于系统开发和库开发、语法更加泛华和简单化、更加稳定和安全,不仅功能更强大,而且能提升程序员的开发效率,公司实际项目开发中也用得比较多。许多功能看起来会很怪,效果却很好,所以我们要作为一个 重点去学习。在2003年C++标准委员会曾经提交了一份技术勘误表(简称TC1),使得C++03这个名字已经取代了 C++98称为C++11之前的最新C++标准名称。

kkbca的博客 1024

C++初始化参数列表

本文介绍了C++中初始化参数列表的用法与注意事项。初始化参数列表通过冒号(:)在构造函数声明后直接初始化成员变量,相比构造函数体内赋值更高效,能避免默认构造与赋值的双重开销。尤其适用于常量成员(const)和引用成员(&)的初始化,这两者必须使用初始化列表。文章还指出成员变量的初始化顺序与其声明顺序一致,而非初始化列表中的顺序,并通过示例说明了顺序错误可能导致的隐患。此外,文中比较了初始化列表与构造函数体内赋值的差异,包括初始化时机、性能影响和适用场景等,强调了初始化列表在性能优化和特定成员初始化方

2302_80908313的博客 713
上一篇: 本地验证http服务器拉取文件
下一篇: const int *
越甲八千
博客等级 码龄11年 2959粉丝 553原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值