news 2026/4/16 20:03:00

3.15 引用类型

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
3.15 引用类型

3.15 引用类型

C++中值传递实现的是值得单向传递,而引用传递实现的是值的双向传递。

应用类型的语法规定

引用(&)是标识符的别名 定义一个引用时,必须同时对它进行初始化,是他执行一个已存在的对象;定义引用以后马上就要跟一个已经存在的变量联系起来,得说清楚是谁的引用,因此定义引用时必须初始化,必须要用一个已经存在的对象或者变量初始化这个引用。 一旦一个引用被初始化后,就不能改为指向其它对象。 C++中引用大多用来作为函数的形参出现的,进而实现函数参数的双向传递 int i,j; int &ri=i;//定义int引用ri,并初始化为变量i的引用

例:输入两个整数并交换(值传递)

#include <iostream> using namespace std; void swap(int a, int b); int main() { int x; int y; cout << "请输入要交换的整数值" << endl; cin >> x >> y; swap(x, y); cout << "x的值为" << x << ",y的值为" << y; return 0; } void swap(int a, int b) { int i; i = a; a = b; b = i; cout << "a的值为" << a << ",b的值为" << b; }

其对应的汇编

--- E:\C++\C++\3_13.cpp -------------------------------------------------------- 1: #include <iostream> 2: using namespace std; 3: void swap (int a, int b); 4: int main() { 00007FF60DC86960 40 55 push rbp 00007FF60DC86962 57 push rdi 00007FF60DC86963 48 81 EC 28 01 00 00 sub rsp,128h 00007FF60DC8696A 48 8D 6C 24 20 lea rbp,[rsp+20h] 00007FF60DC8696F 48 8D 7C 24 20 lea rdi,[rsp+20h] 00007FF60DC86974 B9 12 00 00 00 mov ecx,12h 00007FF60DC86979 B8 CC CC CC CC mov eax,0CCCCCCCCh 00007FF60DC8697E F3 AB rep stos dword ptr [rdi] 00007FF60DC86980 48 8B 05 79 66 00 00 mov rax,qword ptr [__security_cookie (07FF60DC8D000h)] 00007FF60DC86987 48 33 C5 xor rax,rbp 00007FF60DC8698A 48 89 85 F8 00 00 00 mov qword ptr [rbp+0F8h],rax 00007FF60DC86991 48 8D 0D F0 C6 00 00 lea rcx,[__CEA39ACC_3_13@cpp (07FF60DC93088h)] 00007FF60DC86998 E8 69 AA FF FF call __CheckForDebuggerJustMyCode (07FF60DC81406h) 00007FF60DC8699D 90 nop 5: int x; 6: int y; 7: cout << "请输入要交换的整数值" << endl; 00007FF60DC8699E 48 8D 15 43 43 00 00 lea rdx,[string "\xc7\xeb\xca\xe4\xc8\xeb\xd2\xaa\xbd\xbb\xbb\xbb\xb5\xc4\xd5\xfb\xca\xfd\xd6\xb5" (07FF60DC8ACE8h)] 00007FF60DC869A5 48 8B 0D EC A7 00 00 mov rcx,qword ptr [__imp_std::cout (07FF60DC91198h)] 00007FF60DC869AC E8 DB A6 FF FF call std::operator<<<std::char_traits<char> > (07FF60DC8108Ch) 00007FF60DC869B1 48 8D 15 84 A6 FF FF lea rdx,[std::endl<char,std::char_traits<char> > (07FF60DC8103Ch)] 00007FF60DC869B8 48 8B C8 mov rcx,rax 00007FF60DC869BB FF 15 BF A7 00 00 call qword ptr [__imp_std::basic_ostream<char,std::char_traits<char> >::operator<< (07FF60DC91180h)] 00007FF60DC869C1 90 nop 8: cin >> x >> y; 00007FF60DC869C2 48 8D 55 04 lea rdx,[x] 00007FF60DC869C6 48 8B 0D 83 A7 00 00 mov rcx,qword ptr [__imp_std::cin (07FF60DC91150h)] 00007FF60DC869CD FF 15 8D A7 00 00 call qword ptr [__imp_std::basic_istream<char,std::char_traits<char> >::operator>> (07FF60DC91160h)] 00007FF60DC869D3 48 8D 55 24 lea rdx,[y] 00007FF60DC869D7 48 8B C8 mov rcx,rax 00007FF60DC869DA FF 15 80 A7 00 00 call qword ptr [__imp_std::basic_istream<char,std::char_traits<char> >::operator>> (07FF60DC91160h)] 00007FF60DC869E0 90 nop 9: swap(x, y); 00007FF60DC869E1 8B 55 24 mov edx,dword ptr [y] 00007FF60DC869E4 8B 4D 04 mov ecx,dword ptr [x] 00007FF60DC869E7 E8 83 AA FF FF call swap (07FF60DC8146Fh) 00007FF60DC869EC 90 nop 10: cout << "x的值为" << x << ",y的值为" << y; 00007FF60DC869ED 48 8D 15 24 43 00 00 lea rdx,[string "x\xb5\xc4\xd6\xb5\xce\xaa" (07FF60DC8AD18h)] 00007FF60DC869F4 48 8B 0D 9D A7 00 00 mov rcx,qword ptr [__imp_std::cout (07FF60DC91198h)] 00007FF60DC869FB E8 8C A6 FF FF call std::operator<<<std::char_traits<char> > (07FF60DC8108Ch) 00007FF60DC86A00 8B 55 04 mov edx,dword ptr [x] 00007FF60DC86A03 48 8B C8 mov rcx,rax 00007FF60DC86A06 FF 15 6C A7 00 00 call qword ptr [__imp_std::basic_ostream<char,std::char_traits<char> >::operator<< (07FF60DC91178h)] 00007FF60DC86A0C 48 8D 15 F5 42 00 00 lea rdx,[string ",y\xb5\xc4\xd6\xb5\xce\xaa" (07FF60DC8AD08h)] 00007FF60DC86A13 48 8B C8 mov rcx,rax 00007FF60DC86A16 E8 71 A6 FF FF call std::operator<<<std::char_traits<char> > (07FF60DC8108Ch) 00007FF60DC86A1B 8B 55 24 mov edx,dword ptr [y] 00007FF60DC86A1E 48 8B C8 mov rcx,rax 00007FF60DC86A21 FF 15 51 A7 00 00 call qword ptr [__imp_std::basic_ostream<char,std::char_traits<char> >::operator<< (07FF60DC91178h)] 00007FF60DC86A27 90 nop 11: return 0; 00007FF60DC86A28 33 C0 xor eax,eax 12: } 00007FF60DC86A2A 8B F8 mov edi,eax 00007FF60DC86A2C 48 8D 4D E0 lea rcx,[rbp-20h] 00007FF60DC86A30 48 8D 15 09 42 00 00 lea rdx,[__xt_z+1A0h (07FF60DC8AC40h)] 00007FF60DC86A37 E8 5C A9 FF FF call _RTC_CheckStackVars (07FF60DC81398h) 00007FF60DC86A3C 8B C7 mov eax,edi 00007FF60DC86A3E 48 8B 8D F8 00 00 00 mov rcx,qword ptr [rbp+0F8h] 00007FF60DC86A45 48 33 CD xor rcx,rbp 00007FF60DC86A48 E8 C5 A7 FF FF call __security_check_cookie (07FF60DC81212h) 00007FF60DC86A4D 48 8D A5 08 01 00 00 lea rsp,[rbp+108h] 00007FF60DC86A54 5F pop rdi 00007FF60DC86A55 5D pop rbp 00007FF60DC86A56 C3 ret --- 无源文件 -----------------------------------------------------------------------

例:输入两个整数并交换(引用传递)

#include <iostream> using namespace std; void swap(int& a, int& b); int main() { int x = 5; int y = 6; cout << "x=" << x << ",y=" << y; swap(x, y); cout << "x=" << x << ",y=" << y; return 0; } void swap(int& a, int& b) { int i; i = a; a = b; b = i; }

其对应的汇编

--- E:\C++\C++\3_14.cpp -------------------------------------------------------- 1: #include <iostream> 2: using namespace std; 3: void swap(int& a, int& b); 4: int main() { 00007FF7146F65A0 40 55 push rbp 00007FF7146F65A2 57 push rdi 00007FF7146F65A3 48 81 EC 28 01 00 00 sub rsp,128h 00007FF7146F65AA 48 8D 6C 24 20 lea rbp,[rsp+20h] 00007FF7146F65AF 48 8D 7C 24 20 lea rdi,[rsp+20h] 00007FF7146F65B4 B9 12 00 00 00 mov ecx,12h 00007FF7146F65B9 B8 CC CC CC CC mov eax,0CCCCCCCCh 00007FF7146F65BE F3 AB rep stos dword ptr [rdi] 00007FF7146F65C0 48 8B 05 39 6A 00 00 mov rax,qword ptr [__security_cookie (07FF7146FD000h)] 00007FF7146F65C7 48 33 C5 xor rax,rbp 00007FF7146F65CA 48 89 85 F8 00 00 00 mov qword ptr [rbp+0F8h],rax 00007FF7146F65D1 48 8D 0D B1 CA 00 00 lea rcx,[__7C8346DC_3_14@cpp (07FF714703089h)] 00007FF7146F65D8 E8 15 AE FF FF call __CheckForDebuggerJustMyCode (07FF7146F13F2h) 00007FF7146F65DD 90 nop 5: int x = 5; 00007FF7146F65DE C7 45 04 05 00 00 00 mov dword ptr [x],5 6: int y = 6; 00007FF7146F65E5 C7 45 24 06 00 00 00 mov dword ptr [y],6 7: cout << "x=" << x << ",y=" << y; 00007FF7146F65EC 48 8D 15 F5 46 00 00 lea rdx,[string "x=" (07FF7146FACE8h)] 00007FF7146F65F3 48 8B 0D 9E AB 00 00 mov rcx,qword ptr [__imp_std::cout (07FF714701198h)] 00007FF7146F65FA E8 8D AA FF FF call std::operator<<<std::char_traits<char> > (07FF7146F108Ch) 00007FF7146F65FF 8B 55 04 mov edx,dword ptr [x] 00007FF7146F6602 48 8B C8 mov rcx,rax 00007FF7146F6605 FF 15 9D AB 00 00 call qword ptr [__imp_std::basic_ostream<char,std::char_traits<char> >::operator<< (07FF7147011A8h)] 00007FF7146F660B 48 8D 15 D2 46 00 00 lea rdx,[string ",y=" (07FF7146FACE4h)] 00007FF7146F6612 48 8B C8 mov rcx,rax 00007FF7146F6615 E8 72 AA FF FF call std::operator<<<std::char_traits<char> > (07FF7146F108Ch) 00007FF7146F661A 8B 55 24 mov edx,dword ptr [y] 00007FF7146F661D 48 8B C8 mov rcx,rax 00007FF7146F6620 FF 15 82 AB 00 00 call qword ptr [__imp_std::basic_ostream<char,std::char_traits<char> >::operator<< (07FF7147011A8h)] 00007FF7146F6626 90 nop 8: swap(x, y); 00007FF7146F6627 48 8D 55 24 lea rdx,[y] 00007FF7146F662B 48 8D 4D 04 lea rcx,[x] 00007FF7146F662F E8 21 AA FF FF call swap (07FF7146F1055h) 00007FF7146F6634 90 nop 9: cout << "x=" << x << ",y=" << y; 00007FF7146F6635 48 8D 15 AC 46 00 00 lea rdx,[string "x=" (07FF7146FACE8h)] 00007FF7146F663C 48 8B 0D 55 AB 00 00 mov rcx,qword ptr [__imp_std::cout (07FF714701198h)] 00007FF7146F6643 E8 44 AA FF FF call std::operator<<<std::char_traits<char> > (07FF7146F108Ch) 00007FF7146F6648 8B 55 04 mov edx,dword ptr [x] 00007FF7146F664B 48 8B C8 mov rcx,rax 00007FF7146F664E FF 15 54 AB 00 00 call qword ptr [__imp_std::basic_ostream<char,std::char_traits<char> >::operator<< (07FF7147011A8h)] 00007FF7146F6654 48 8D 15 89 46 00 00 lea rdx,[string ",y=" (07FF7146FACE4h)] 00007FF7146F665B 48 8B C8 mov rcx,rax 00007FF7146F665E E8 29 AA FF FF call std::operator<<<std::char_traits<char> > (07FF7146F108Ch) 00007FF7146F6663 8B 55 24 mov edx,dword ptr [y] 00007FF7146F6666 48 8B C8 mov rcx,rax 00007FF7146F6669 FF 15 39 AB 00 00 call qword ptr [__imp_std::basic_ostream<char,std::char_traits<char> >::operator<< (07FF7147011A8h)] 00007FF7146F666F 90 nop 10: return 0; 00007FF7146F6670 33 C0 xor eax,eax 11: } 00007FF7146F6672 8B F8 mov edi,eax 00007FF7146F6674 48 8D 4D E0 lea rcx,[rbp-20h] 00007FF7146F6678 48 8D 15 C1 45 00 00 lea rdx,[__xt_z+1A0h (07FF7146FAC40h)] 00007FF7146F667F E8 00 AD FF FF call _RTC_CheckStackVars (07FF7146F1384h) 00007FF7146F6684 8B C7 mov eax,edi 00007FF7146F6686 48 8B 8D F8 00 00 00 mov rcx,qword ptr [rbp+0F8h] 00007FF7146F668D 48 33 CD xor rcx,rbp 00007FF7146F6690 E8 73 AB FF FF call __security_check_cookie (07FF7146F1208h) 00007FF7146F6695 48 8D A5 08 01 00 00 lea rsp,[rbp+108h] 00007FF7146F669C 5F pop rdi 00007FF7146F669D 5D pop rbp 00007FF7146F669E C3 ret --- 无源文件 -----------------------------------------------------------------------
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/16 11:03:15

基于微信小程序的早餐店管理系统毕业设计

摘要围绕微信小程序早餐店管理系统&#xff0c;设计了一套覆盖用户端、商家端及后台管理的核心功能体系&#xff0c;旨在通过数字化手段提升早餐店运营效率与用户体验。系统以轻量化小程序为入口&#xff0c;结合智能化管理后台&#xff0c;实现从订单处理到用户运营的全流程闭…

作者头像 李华
网站建设 2026/4/16 8:56:42

36、网络打印机与打印服务管理全攻略

网络打印机与打印服务管理全攻略 1. 打印机安装后检查与多打印机设置 在 Windows 完成打印机驱动安装和打印机配置后,会出现一个状态页面。在继续操作之前,要确保驱动和打印机安装成功。若出现错误,需纠正问题并重复安装过程。若要测试打印机,可选择“打印测试页”,然后…

作者头像 李华
网站建设 2026/4/16 12:25:38

42、Windows Server 2012 R2 数据备份与恢复全解析

Windows Server 2012 R2 数据备份与恢复全解析 在服务器的日常运行中,数据备份和恢复至关重要。它能帮助我们应对各种突发情况,如系统故障、数据丢失等。本文将详细介绍 Windows Server 2012 R2 中的数据备份和恢复方法,包括系统状态备份与恢复、Active Directory 恢复、操…

作者头像 李华
网站建设 2026/4/16 12:28:06

25、畅享Windows Vista 中的音乐与视频世界

畅享Windows Vista 中的音乐与视频世界 1. 音频与视频设置 在Windows Vista系统中,有不少实用的音频和视频设置功能。SRS Labs推出的WOW音频应用程序,能逐步增强音频的低音效果和拓宽立体声场,用户通过滑动条即可轻松控制。而在视频设置方面,如同操作电视机一样,可借助M…

作者头像 李华
网站建设 2026/4/16 16:12:13

35、优化 Windows Vista 性能,畅享多媒体与应用体验

优化 Windows Vista 性能,畅享多媒体与应用体验 1. 多媒体使用优化 在 Windows Vista 系统中,多媒体使用的优化与游戏优化极为相似,因为二者都对系统资源有着较高的需求。以下是一些具体的优化建议: - 硬盘碎片整理 :为确保系统性能,需对硬盘进行碎片整理。这能让硬…

作者头像 李华
网站建设 2026/4/16 12:59:21

工厂模式与策略模式的深度实践:从代码优化到架构思考

作者&#xff1a;打码养家 日期&#xff1a;2025年12月19日 场景&#xff1a;第三方登录系统重构&#xff08;钉钉、企业微信等&#xff09;一、背景&#xff1a;为什么需要重构&#xff1f;在开发一个 SaaS 平台时&#xff0c;我们最初采用最朴素的方式实现第三方登录&#xf…

作者头像 李华