3.15 引用类型

3.15 引用类型

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

应用类型的语法规定

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

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

C++ 复制代码
#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;
}

其对应的汇编

assembly 复制代码
--- 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  
--- 无源文件 -----------------------------------------------------------------------

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

c++ 复制代码
#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;
	
}

其对应的汇编

assembly 复制代码
--- 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  
--- 无源文件 -----------------------------------------------------------------------
相关推荐
木心爱编程2 小时前
【Qt 5.14.2 新手实战】QTC++入门筑基——10 分钟做个文本编辑器:QLineEdit + QTextEdit 核心用法
java·c++·qt
暗之星瞳2 小时前
随机森林(初步学习)
算法·随机森林·机器学习
不爱吃糖的程序媛2 小时前
基于Ascend C开发的Vector算子模板库-ATVOSS 技术深度解读
人工智能·算法·机器学习
松涛和鸣2 小时前
35、Linux IPC进阶:信号与System V共享内存
linux·运维·服务器·数据库·算法·list
Cx330❀2 小时前
《C++ 动态规划》第001-002题:第N个泰波拉契数,三步问题
开发语言·c++·算法·动态规划
神仙别闹2 小时前
基于Qt5(C++)+SQLite 开发的一个小巧精美的本地音乐播放器
开发语言·c++·qt
LYFlied2 小时前
【每日算法】LeetCode 114. 二叉树展开为链表:从树结构到线性结构的优雅转换
数据结构·算法·leetcode·链表·面试·职场和发展
cheniie2 小时前
Windows下c/c++使用pgsql
c++·windows·postgresql
毕设源码-钟学长2 小时前
【开题答辩全过程】以 基于Spark机器学习算法的体育新闻智能分类系统设计与实现为例,包含答辩的问题和答案
算法·机器学习·spark