C++数据类型 — 引用的理解与应用

深入理解 C++ 数据类型:从基础到高级应用 C++ 是一种强类型语言,这意味着每个变量都必须有明确的数据类型,以便编译器知道如何存储和操作数据。数据类型决定了变量的内存占用、取值范围以及可以执行的操作。理解 C++ 的数据类型是编写高效、安全代码的基础。本文将全面介绍 C++ 的数据类型,包括基本数据类型、派生类型、用户自定义类型,以及 C++11/14/17 引入的新特性,帮助读者掌握数据类型的核心概念和应用场景。 阅读详情

目录

 

C++的“引用”详解

引用作为函数的返回值

参数的引用来传值

常量引用

引用的意义

引用的本质


 

C++的“引用”详解

 

本质:一块内存,有两个名字;

定义方式如下:

       类型名 &引用名 = 同类型的某变量名;

此种写法就定义了一个某种类型的引用,并将其初始化为引用某个同类型的变量。“引用名”的命名规则和普通变量相同。

int n;
int & r = n;
  1. r就是一个引用,也可以说 r 的类型是 int &。第二条语句使得 r 引用了变量 n,也可以说 r 成为了 n 的引用。某个变量的引用和这个变量是一回事,相当于该变量的一个别名。
  2. 注意:定义引用时一定要将其初始化,否则编译无法通过。通常会用某个变量去初始化引用,初始化后,它就一直引用该变量,不会再引用别的变量。
  3. 也可以用一个引用去初始化另一个引用,这样两个引用就引用同一个变量。不能用常量初始化引用,也不能用表达式初始化引用(除非该表达式的返回值是某个变量的引用)。总之,引用只能引用变量。

类型为 T& 的引用和类型为 T 的变量是完全兼容的,可以互相赋值。如下:

#include <iostream>
using namespace std;
int main()
{
	int n = 4;
	int & r = n;  //r引用了n,从此r和n是一回事
	r = 4; //修改r就是修改n
	cout << r << endl;  //输出4
	cout << n << endl;  //输出4

	n = 5;              //修改n就是修改r
	cout << r << endl;  //输出 5

	int & r2 = r;         //r2和r引用同一个变量,就是n
	cout << r2 << endl; //输出 5
	return 0;
}

引用作为函数的返回值


#include <iostream>
using namespace std;

int n = 4;

int & SetValue()
{
	return n;  //返回对n的引用
}

int main()
{
    SetValue() = 40; //返回值是引用的函数调用表达式,可以作为左值使用,可以理解为“int &n = 40;”
    //SetValue 函数返回对 n 的引用,因此对 SetValue 函数的返回值进行赋值,
    //就是对 n 进行赋值,结果就是使得 n 的值变为 40。
    cout << n << endl;  //输出40
 
    int & r = SetValue();//表达式 SetValue 函数的返回值是 n 的引用,
    //因此可以用来初始化 r,其结果就 是 r 也成为 n 的引用。可以理解为“int &r = n;”
    cout << r << endl;  //输出40
    return 0;
}

引用作为函数的返回值,其用途会在“运算符重载”和“标准模板库”中有着更广阔的用途。

 

参数的引用来传值

        在 C++ 中,函数参数的传递有两种方式:传值和传引用。在函数的形参不是引用的情况下,参数传递方式是传值的。传引用的方式要求函数的形参是引用。

“传值”是指,函数的形参是实参的一个拷贝,在函数执行的过程中,形参的改变不会影响实参。

#include <iostream>
using namespace std;
void Swap(int a, int b) //参数传值:形参是实参的拷贝;
{
	int tmp;
	//以下三行将a、b值互换
	tmp = a;
	a = b;
	b = tmp;
	cout << "In Swap: a = " << a << " b = " << b << endl;
}
int main()
{
	int a = 4, b = 5;
	Swap(a, b);
	cout << "After swaping: a = " << a << " b = " << b << endl; //输出:4,5
	return 0;
}

        如果函数的形参是引用,那么参数的传递方式就是传引用的。在传引用方式下,形参是对应的实参的引用。也就是说,形参和对应的实参是一回事,形参的改变会影响实参。

#include<iostream>
using namespace std;
void Swap(int & a, int & b)
{ //交换a、b的值
	int tmp;
	tmp = a; a = b; b = tmp;
}
int main()
{
	int n1 = 100, n2 = 50;
	Swap(n1, n2);  //n1、n2 的值被交换
	cout << n1 << " " << n2 << endl;  //输出 50 100
}

常量引用

定义引用时,可以在前面加 const 关键字,则该引用就成为“常引用”。如:

int n;
const int & r = n; //定义了常引用 r,其类型是 const int &。

常引用和普通引用的区别在于:不能通过常引用去修改其引用的内容。注意,不是常引用所引用的内容不能被修改,只是不能通过常引用去修改而已,但可以用别的办法修改。如下代码所示:

int n = 100;
const int & r = n;
r = 200;  //编译出错,不能通过常引用修改其引用的内容
n = 300;  //没问题,n的值变为300

       注意,const T& 和 T& 是不同的类型。T& 类型的引用或 T 类型的变量可以用来初始化 const T & 类型的引用,const T 类型的常变量和 const T & 类型的引用则不能用来初始化 T & 类型的引用,除非进行强制类型转换。例如下面的程序:


void Func(char & r) { }
void Func2(const char & r) { }
int main()
{
	const char cc = 'a';
	char c;
	const char & rcc = cc;
	const char & rc = c;  //char变量可以用来初始化 const char & 的引用

	char & r = cc;  //编译出错,const char 类型的常变量不能用来初始化 char & 类型的引用
	char & r2 = (char &)cc;  //没问题,强制类型转换
	
	Func(rcc);  //编译出错,参数类型不匹配
	Func2(rcc);  //没问题,参数类型匹配
	return 0;
}

引用的意义

1)引用作为其它变量的别名而存在,因此在一些场合可以代替指针

2)引用相对于指针来说具有更好的可读性和实用性

 

引用的本质

概述:

1)引用在C++中的内部实现是一个常指针

Type& name 等价于 Type* const name

2)C++编译器在编译过程中使用常指针作为引用的内部实现,因此引用所占用的空间大小与指针相同。

3)从使用的角度,引用会让人误会其只是一个别名,没有自己的存储空间。这是C++为了实用性而做出的细节隐藏,引用的那个量也占用存储空间,就如同指针一样。

证明引用本质是常量:

#include<iostream>
using namespace std;

int main()
{
	int a = 10;
	int &b = a;
	b = 11; //重新赋值 

	printf("a=%d\n", a);
	printf("b=%d\n", b);
	printf("a的地址:%x\n", &a);
	printf("&的地址:%x\n", &b); 

	return 0;
}
/*单独定义的引用时,必须初始化;说明很像一个常量
输出:
a=11
b=11
a的地址:6dfe98
&的地址:6dfe98 
*/

证明引用也占用存储空间,并且大小和指针一样:

#include<iostream>
using namespace std;

struct Student {
	int &x;
};
struct Teacer {
	int &a;
	int &b;
};
int main()
{
	printf("sizeof(Student): %d\n", sizeof(Student));
	printf("sizeof(Teacher): %d\n", sizeof(Teacer));
	system("pause");
	return 0;
}
/*输出:(跟指针神似) 
sizeof(Student): 4
sizeof(Teacher): 8
*/

 

17、C++数据类型、结构与交叉引用解析 本文深入解析了C++中的数据类型、结构与交叉引用机制,涵盖析构函数的执行顺序、函数重载与名称修饰的实现方式、运行时类型识别(RTTI)的原理及实现差异、利用虚函数表和构造函数调用链判断继承关系的方法,以及Ghidra中交叉引用(XREF)的类型、作用和分析流程。通过这些内容,逆向工程师可以更好地理解C++程序的运行机制,并利用Ghidra等工具提高分析效率。 阅读详情

相关推荐

GB28181协议实战:5分钟搞定海康摄像头SIP注册失败问题(附Wireshark抓包分析)

本文详细解析了海康摄像头在GB28181协议下SIP注册失败的7个关键原因及解决方案,包括网络可达性、鉴权参数、NAT穿越等核心问题。通过Wireshark抓包分析,提供快速定位方法,帮助工程师高效解决SIP注册失败问题,提升实时图像联调效率。

weixin_29212867的博客 551

C++引用(&)详解

对于习惯于使用C语言来进行编写程序的朋友来说,在学习C++的过程当中遇见了引用(&)符 号,可能会有点懵,因为在C语言中的&是取地址符。但是在C++中&有着不一样的用处,当你能够正确掌握C++的&,它将会是你在编写C++程序的道路上的一把提高代码执行效率和增强代码质量的一把利器。引用不是新定义的一个变量,它是给已存在的某个变量取的别名,编译器不会为引用变量开辟空间,它和它所引用的变量共用同一块内存空间。 ......

weixin_58250064的博客 2万+

华为交换机链路聚合对接思科交换机链路聚合故障

2台华为交换机采用堆叠方式与思科交换机之间使用链路聚合,华为交换机与cisco交换机链路捆绑接口频繁UP/DOWN,业务中断。

网络工程师日常的博客 2116

C++ 引用(&)的超详细解析(小白必看系列)

C++ 的引用(&)多角度分析,让你一看就懂!

weixin_45031801的博客 4万+

【吃瓜教程】周志华西瓜书课后习题第一章答案

第一章 1.1表1.1中若只包含编号为1和4的两个样例,试给出相应的版本空间。 编号 色泽 根蒂 敲声 好瓜(标记) 1 青绿 蜷缩 浊响 是Y 4 乌黑 稍蜷 沉闷 否N 知识储备: 假设空间: 所有假设组成的空间 版本空间:与训练集一致的假设集合 从假设空间到版本空间算法大致如下: 1.删除与正例不一致的假设且删除与反例一致的假设 2.删除与正例不一致的假设 3.删除与反例一致的假设 具体选择哪种

MaxQuYY的博客 8370

【低空经济】森林火情高精度监测与早期预警无人机巡护方案

在全球范围内,森林火灾已成为一个严重的生态和社会问题。它不仅对自然生态系统造成了毁灭性的影响,还对人类的生命财产安全构成了极大的威胁。根据国际森林发展组织的统计,全球每年因森林火灾造成的经济损失高达数百亿美元,甚至在某些年份,火灾损失占到某些国家国民经济总量的相当一部分。因此,开展高效的森林火情监测与早期预警工作显得尤为重要。随着科技的发展,无人机作为新兴的监测工具,以其高效、灵活和经济的特点在森林火灾监测领域展现出了巨大的潜力。

2502_92579126的博客 1211

C++ 中的& 符号

在c++中, &符号有几种不同的意思.1. 表示位与 2. 表示一个变量是另一个已存在变量的别名. 紧跟在变量类型后面.int i = 5;int &ri = i; // 注意是把一个变量直接复制给它的别名. //此处的&没有指针的意思, 只是用来标识一个变量是另一个 //已知变量的别名,所以是直接赋值的  

badbad_boy的专栏 2084

AI风控系统中的实时决策架构:架构师的关键设计

当用户点击「确认支付」时,一场毫秒级的“欺诈攻防战”正在后台悄然打响:系统需要在100ms内完成用户行为特征提取→欺诈模型推理→规则引擎校验→最终决策返回。这就是AI风控实时决策架构的核心——用技术对抗“实时化的欺诈手段”。本文将以「餐厅智能点餐系统」为类比,拆解实时风控架构的每一层逻辑:从“如何快速拿到用户的实时行为特征”(像服务员实时收集顾客的忌口),到“如何让模型和规则协同决策”(像厨师长结合菜谱和经验判断菜能不能做),再到“如何保证系统扛住大促的高并发”(像餐厅加桌子应对客流高峰)。我们会用。

2502_91592937的博客 1472

c++中&含义

在C++中,&amp;既有引用又有取地址,其实他们的区别可以用一句话概括:=号左边是引用,=号右边是取址。 比如   int a=3;     int &amp;b=a;//引用;                                                    int *p=&amp;a; //取地址 引用b,它是变量a的引用,即别名,&amp;在此不是求地址运算,而是起...

AplusX 3万+

LoRa学习:LoRa通信调制解调的实现原理与性能

LoRa学习:LoRa调制解调原理与性能 1、LoRa调制解调器原理 LoRa调制解调器采用专利扩频调制和前向纠错技术。与传统的FSK、OOK调制技术相比,LoRa扩大了无线通讯链路的覆盖范围(实现了远距离无线传输),提高了链路的鲁棒性。。 开发人员可调整扩频因子和纠错率这两个参数,从而平衡通讯时的带宽占用、通信速率、空中包的存活时间、以及抗干扰性等。。 LoRa调制解调器...

HowieXue 薛永浩的博客 3万+

PY32F406K1CU6+I2C+ AT24C64 基本配置

【代码】PY32F406K1CU6+I2C+ AT24C64 基本配置。

sam的博客 90

C++ 引用

C++ 引用(&) ​ 在C语言中&的作用是取地址符,常常用在函数传参中的指针赋值,但在C++中&表示引用,即对已定义的变量的别名(另一个名称)。引用变量的主要用途是用在函数的形参。 1.引用介绍 引用就是对定义的某一变量(目标)的一个别名,对引用的操作与对变量直接操作完全一样。 引用的声明方法:类型标识符 &引用名=目标变量名; 如下程序: #include &l...

happyday_d的博客 856

STM32F407中文手册

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

C++入门 | 函数重载、引用、内联函数

函数重载:是函数的一种特殊情况,C++允许在同一作用域中声明几个功能类似的同名函数,这些同名函数的形参列表(参数个数/类型/类型顺序)不同,常用来处理实现功能类似数据类型不同的问题。

小黄鸭的博客 1137

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

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

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

c++中的引用本质

1.普通引用必须要初始化:void main(){ int a = 10; int &amp;b = a; //int &amp;c;//因为没有初始化,所以会报错}//引用做函数参数不用初始化void swap(int &amp;x, int &amp;y){ int c = 0; c = x; x = y; y = c;}void main(){ int a = 10; int b = 20;...

RitaAndWakaka的博客 272

【一起来学C++构造数据类型吧】

通过以上的学习,我们可以掌握了C++中几种重要的构造数据类型:枚举类型、数组、指针、引用以及结构与联合。这些知识是C++编程的基础,理解并熟练运用它们对于编写高效、灵活的C++程序至关重要,赶紧去实践吧。枚举类型是一种用户自定义的数据类型,它允许我们为一组整数常量指定有意义的名字。cout << "今天是星期一" << endl;指针是C++中非常重要的概念,它存储的是变量的内存地址。

2401_88838892的博客 297

[C++基础]019_指针和引用(int*、int&、int*&、int&*、int**)

相信很多CPPers跟我一样,曾经在指针和引用里徘徊了很久很久。经常弄混指针和引用,尤其是见到如题中列出那些用法,着实是伤脑经。 后来,在项目中用着用着,就能搞清楚区别了,算是会用吧。然而,对于一个Programmer,最忌讳的就是不知其所以然,会用和懂是两番天地。停留在会用的人,始终是原地打转;而懂的人,一通百通,能举一反三。 本文,就如题的指针和引用的用法做一个介绍。 首先我们来普及一下...

weixin_33969116的博客 622

指针与引用

//---------------------------------------------------------------------引用是一种没有指针语法的指针.与指针一样,引用提供对对象的间接访问.--《c++ primer》p29虽然引用也可以被用作一种指针,但是象对指针一样用一个对象的地址初始化一个引用却是错误的。例如:int i=0;int &refi=i; //ok,refi指

托雷斯基的专栏 539

C++小笔记(C++ Primer 第二章)

C++ Primer基础之拾记 前两天看了C++Primer的第二章部分内容,有些点容易混淆和忘记,这里做个简单的笔记,算是一个小的复习 基础数据类型:整形、浮点型、字符型、字符串型、布尔型。这些数据类型又会包含有符号和无符号数据类型 有符号:C++中默认每种类型所表示数值总数范围是0点对称的 无符号:注意无符号类型变量的赋值于计算过程有可能会出现我们意想不到的结果,因为超过了无符号类型变量的表示范围,会对该超出表示范围的值求无符号类型变量存储总数进行求模然后求余(假设赋值为a,无符号类型的数值表示

weixin_37792912的博客 479

命名空间、与c的数据类型的区别、中和函数、引用

一、c++介绍 由本加尼斯特劳斯特鲁普于1979年4月份至1979年10月份完成了第一个C++的预处理,为C语言增加了类机制,也就是面向对象,也就是C++ 区别: 1、c++完全兼容C语言 2、支持面向对象的编程思想(封装、抽象、继承、多态) 3、支持运算符、函数重载。 4、支持泛型编程、模版。 5、支持异常处理 6、支持类型检查严格 二、第一个c++程序 1、文件扩展名:.cpp .cc .c .cxx 2、编译器:g++大多数的Linux系统需要额外安装。 sudo apt-get install g+

Oliverxuc的博客 400

指针和引用的区别

指针和引用的区别。   From :http://blog.youkuaiyun.com/listening_music/article/details/6921608 下面用通俗易懂的话来概述一下: 指针-对于一个类型T,T*就是指向T的指针类型,也即一个T*类型的变量能够保存一个T对象的地址,而类型T是可以加一些限定词的,如const、volatile等等。见下图,所示指针的含义:...

weixin_34015860的博客 92

数组和指针的区别,数组和引用的区别

数组和指针的区别 (1)定义 数组是一个符号,不是变量,因而没有自己对应的存储空间。但是,指针是一个变量,里面存储的内容是另外一个变量的地址,因为是变量所以指针有自己的内存空间,只不过里面存储的内容比较特殊。 (2)区别 a.对于声明和定义,指针和数组是不相同的,定义为数组,则声明也应该是数组,不可混淆 b.当作下标操作符时,指针和数组是等价的。a[i]会被编译器翻译成*(a+i).

Sweet_wen的博客 746

C# 与C++的数据转换

一、类型转化 下面重点罗列下常用的类型转化。 C++类型 C#类型 备注说明 Int Int16、Int32 没有悬念,直接转化 Uint UInt16、Uint32、int 在程序中,不太清楚是,就可以直接对应为int Long Int32 ...

weixin_30655569的博客 594

深入理解c++中的引用,掌握引用最基础的知识

c++中引用的深度理解

2302_80401830的博客 1272

从外到内理解c++引用

从外到内理解c++引用

weixin_52259848的博客 2万+

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

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

朋朋の优快云博客 6009
上一篇: C++功能体 — namespace的理解与使用
下一篇: 【C数据类型】基本数据类型
ALGO阿狗
博客等级 码龄9年 64粉丝 149原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值