返回顶部
首页 > 资讯 > 后端开发 > 其他教程 >C++引用的本质与意义是什么
  • 129
分享到

C++引用的本质与意义是什么

2023-06-30 07:06:49 129人浏览 八月长安
摘要

本篇内容介绍了“c++引用的本质与意义是什么”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!一、引用的意义引用作为变量别名而存在,因此在一些场

本篇内容介绍了“c++引用的本质与意义是什么”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!

一、引用的意义

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

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

C++引用的本质与意义是什么

下面通过代码来进行说明,在C语言中,可以这么写:

#include <stdio.h>void swap(int* a, int* b){int t = *a;*a = *b;*b = t;}int main(){int a = 1;int b = 2;swap(&a, &b);printf("a = %d, b = %d\n", a, b);return 0;}

下面为输出结果,可以看到a,b被交换。

C++引用的本质与意义是什么

若采用C++用的引用,则采用下面的代码:

#include <stdio.h>void swap(int& a, int& b){int t = a;a = b;b = t;}int main(){int a = 1;int b = 2;swap(a, b);printf("a = %d, b = %d\n", a, b);return 0;}

下面为输出结果,需要注意的是,引用作为函数的形参时,不需要进行初始化,初始化发生在函数调用的时候(形参一旦被初始化后,就代表两个具体的外部变量)。

C++引用的本质与意义是什么

二、特殊的引用

const 引用

  • 在C++中可以声明const 引用

  • const Type& name = var ;

  • const 引用让变量拥有只读属性

  • 当使用常量对const引用进行初始化时,C++编译器会为常量值分配空间,并将引用名作为这段空间的别名

C++引用的本质与意义是什么

所以上面那段代码,b = 5 是不正确的,因为 b 已经是只读变量了,但是依旧可以通过指针改变这个只读变量的值。

结论:使用常量对const 引用初始化后将生成一个只读变量

下面看一段代码,加深理解:

#include <stdio.h>void Example(){    printf("Example:\n");    int a = 4;    const int& b = a;    int* p = (int*)&b;    //b = 5;    *p = 5;    printf("a = %d\n", a);    printf("b = %d\n", b);}void Demo(){    printf("Demo:\n");    const int& c = 1;    int* p = (int*)&c;    //c = 5;    *p = 5;    printf("c = %d\n", c);}int main(int arGC, char *argv[]){    Example();    printf("\n");    Demo();    return 0;}

下面为输出结果:

C++引用的本质与意义是什么

如果把那两行(b = 5,c = 5)取消注释,则就会输出下面结果,编译器会报 b 和 c 都是只读变量的错误。

C++引用的本质与意义是什么

三、引用是否占用存储空间

下面看一段代码:

#include <stdio.h>struct TRef{    char& r;};int main(int argc, char *argv[]){     char c = 'c';    char& rc = c;    TRef ref = { c };    printf("sizeof(char&) = %d\n", sizeof(char&));//char类型占用一个字节 1    printf("sizeof(rc) = %d\n", sizeof(rc));//sizeof(c) => 1    printf("sizeof(TRef) = %d\n", sizeof(TRef));//?    printf("sizeof(ref.r) = %d\n", sizeof(ref.r));//sizeof(c) => 1    return 0;}

下面为输出结果,可以看到sizeof(TRef)占用的内存空间为4,我们知道指针占用的内存空间为4,那么指针和引用到底有什么关系呢?第4节来分析。

C++引用的本质与意义是什么

四、引用的本质

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

C++引用的本质与意义是什么

注意:

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

  • 从使用的角度,引用只是一个别名,C++为了实用性而隐藏了引用的存储空间这一细节。

通过下面的代码,也可以很好的理解引用所占的字节数:

#include <stdio.h>struct TRef{    char* before;    char& ref;    char* after;};int main(int argc, char* argv[]){    char a = 'a';    char& b = a;    char c = 'c';    TRef r = {&a, b, &c};    printf("sizeof(r) = %d\n", sizeof(r));    printf("sizeof(r.before) = %d\n", sizeof(r.before));    printf("sizeof(r.after) = %d\n", sizeof(r.after));    printf("&r.before = %p\n", &r.before);    printf("&r.after = %p\n", &r.after);    return 0;}

下面为输出结果,可以看到结构体占用12个字节,before 和 after 指针各占用4个字节,所以 ref 引用当然也占用4个字节,通过 after 的起始内存地址减上 before 的起始内存地址得8,而 before 指针占用4个字节,从这个层面也能知道 ref 引用占用4个字节。

C++引用的本质与意义是什么

为了深入理解引用的本质,可以在 Visual Studio 2012 中进行反汇编,如下图,现在return 0那里打个断点,然后点击本地 windows 调试器,开始执行代码。

C++引用的本质与意义是什么

执行完代码后,鼠标右击空白区域,选择转到反汇编。

C++引用的本质与意义是什么

下面看一下反汇编的部分代码,主要看引用那部分的汇编代码,lea eax,[a] 表示取a的地址,存到 eax 寄存器中,mov dWord ptr [b],eax表示把a 的地址保存到 b 所对应的4个内存空间里面去。可以这么说,引用的内部实现就是指针,所以引用占用内存空间,且占用内存空间大小和指针一样。

C++引用的本质与意义是什么

五、引用的注意事项

C++中的引用旨在大多数的情况下代替指针

  • 功能性:可以满足多数需要使用指针的场合

  • 安全性∶可以避开由于指针操作不当而带来的内存错误

  • 操作性∶简单易用,又不失功能强大

下面通过一个函数返回引用,介绍一下引用的注意事项。

#include <stdio.h>int& demo()    //从内部实现来看,想返回一个指针 int* const{    int d = 0;    printf("demo: d = %d\n", d);    return d; //本质上,相当于 return &d}int& func(){    static int s = 0;    printf("func: s = %d\n", s);    return s;    //本质上,相当于 return &s}int main(int argc, char* argv[]){    int& rd = demo();    int& rs = func();    printf("\n");    printf("main: rd = %d\n", rd);    printf("main: rs = %d\n", rs);    printf("\n");    rd = 10;    rs = 11;    demo();    func();    printf("\n");    printf("main: rd = %d\n", rd);    printf("main: rs = %d\n", rs);    printf("\n");    return 0;}

下面为输出结果,可以看到编译的时候开始发出警告说不能返回局部变量,如果继续运行,可以看到 rd = 9658356,rd 为 d 的别名,按理说应该输出 0 的,为什么输出9658356 呢?这个因为 rd 所代表的的变量在 demo 函数调用返回的时候被摧毁了,其所代表的是一个不存在的变量,所以 rd 没有意义了。

C++引用的本质与意义是什么

引用中必须遵守的规则:不要返回局部变量的引用。 如果局部变量是静态的,则可以。因为静态局部变量的存储区是全局的存储区,所以它的空间不会因为函数的返回而被摧毁。

“C++引用的本质与意义是什么”的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识可以关注编程网网站,小编将为大家输出更多高质量的实用文章!

--结束END--

本文标题: C++引用的本质与意义是什么

本文链接: https://lsjlt.com/news/327758.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • C++引用的本质与意义是什么
    本篇内容介绍了“C++引用的本质与意义是什么”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!一、引用的意义引用作为变量别名而存在,因此在一些场...
    99+
    2023-06-30
  • C++深入探究引用的本质与意义
    目录一、引用的意义二、特殊的引用三、引用是否占用存储空间四、引用的本质五、引用的注意事项六、小结一、引用的意义 引用作为变量别名而存在,因此在一些场合可以代替指针引用相对于指针来说具...
    99+
    2024-04-02
  • css的本质是什么意思
    本教程操作环境:Windows10系统、CSS3版、DELL G3电脑css的本质是什么意思?css的本质是定义元素的样式规则,告诉浏览器如何在网页中显示元素。层叠样式表(英文全称:Cascading Style Sheets)是一种用来表...
    99+
    2023-05-14
    css
  • c#委托的本质是什么
    委托是一种类型安全的指针,指向一个方法。它封装了方法引用,允许将方法作为参数传递,并提供了类型安全保障,强制方法签名与委托定义匹配。 委托的本质 委托本质上是一种类型安全的指针,它指向...
    99+
    2024-04-04
    c#
  • c#多态的核心本质是什么
    C#中的多态性的核心本质是允许不同的对象以不同的方式响应相同的消息或方法调用。这意味着通过基类或接口定义的方法可以被派生类或实现类重...
    99+
    2024-03-05
    c#
  • C#中的预定义类型与引用类型是什么
    今天小编给大家分享一下C#中的预定义类型与引用类型是什么的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。一、预定义的值类型一个...
    99+
    2023-06-30
  • C++中右值引用与移动语义的方法是什么
    今天小编给大家分享一下C++中右值引用与移动语义的方法是什么的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。意义充分利用临时对...
    99+
    2023-07-05
  • C++引用的基本概念是什么
    本篇文章给大家分享的是有关C++引用的基本概念是什么,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。C++编程语言中有很多应用方法和C语言有相同之处。那么作为C语言的升级版本,它...
    99+
    2023-06-17
  • const的本质是什么
    这篇文章主要介绍了const的本质是什么的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇const的本质是什么文章都会有所收获,下面我们一起来看看吧。   并非真正的常量  ...
    99+
    2024-04-02
  • HTML5的本质是什么
    这篇文章将为大家详细讲解有关HTML5的本质是什么,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。  超文本标记语言(HTML)5 第一次向 HTML 中引入新的元素。新的...
    99+
    2024-04-02
  • css的本质是什么
    今天小编给大家分享一下css的本质是什么的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。css的本质是定义元素的样式规则,告诉...
    99+
    2023-07-05
  • Python的本质是什么
    这篇文章主要介绍“Python的本质是什么”,在日常操作中,相信很多人在Python的本质是什么问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Python的本质是什么”的疑惑有所帮助!接下来,请跟着小编一起来...
    99+
    2023-06-02
  • python import的本质是什么
    这篇文章主要讲解了“python import的本质是什么”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“python import的本质是什么”吧!说明import的本质是路径搜索。impo...
    99+
    2023-06-20
  • Spring事务的实现方法与本质是什么
    这篇文章主要介绍了Spring事务的实现方法与本质是什么的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇Spring事务的实现方法与本质是什么文章都会有所收获,下面我们一起来看看吧。一、Spring事务的基础知识...
    99+
    2023-07-05
  • http代理的本质是什么
    这篇文章主要介绍“http代理的本质是什么”,在日常操作中,相信很多人在http代理的本质是什么问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”http代理的本质是什么”的疑惑有所帮助!接下来,请跟着小编一起来...
    99+
    2023-06-21
  • delete语法的本质是什么
    今天小编给大家分享一下delete语法的本质是什么的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。delete 的返回值del...
    99+
    2023-07-05
  • WEB开发的本质是什么
    一、WEB开发的本质是什么 WEB开发,主要指的是利用特定的编程语言和工具,构建和维护网络应用程序或网站的过程。它可以分为前端开发和后端开发两个部分,涵盖了从基本的HTML/CSS,到JavaScript,再到服务器端的Python,...
    99+
    2023-10-29
    本质 WEB
  • WEB的本质究竟是什么
    一、WEB的本质是什么 Web的本质是一个全面的信息处理和交互系统,它使得各种类型的信息能够在全球范围内进行分享和交流,从而为人们提供丰富的信息资源。Web通常包括网页内容、网络服务、数据交互和用户行为等模块。这种平台的使用,帮助人们...
    99+
    2023-10-29
    本质 WEB
  • 什么是C++引用
    这篇文章主要介绍“什么是C++引用”,在日常操作中,相信很多人在什么是C++引用问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”什么是C++引用”的疑惑有所帮助!接下来,请跟着小编一起来学习吧!一、C++ 引用...
    99+
    2023-06-25
  • Java引用与C指针的区别是什么
    Java引用与C指针的区别如下:现象指针在运行时可以改变其所指向的值(地址)即指向其它变量,而引用一旦和某个对象绑定后就不能再改变,总是指向最初的对象。编译程序在编译时分别将指针和引用添加到符号表上,符号表上记录的是变量名以及变量所对应的地...
    99+
    2022-03-17
    Java 引用 C 指针 区别
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作