0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

C++中的const和引用的讨论

电子设计 来源:电子设计 作者:电子设计 2020-12-24 15:35 次阅读

今天给大家分享一下这段时间学习c++的总结学习:c++里面的const关键字和引用。

一、const关键字的总结

1、const什么时候为只读变量,什么时候又是常量呢?

(1)const常量的判别规则:

只用字面量初始化的const常量才会进入符号表

使用其它变量初始化的const常量仍然是只读变量

被volatile修饰的const常量不会进入符号表

在编译期间不能直接确定初始值的const标识符,都被作为只读变量处理

(2)const引用的类型与初始化变量的类型

相同:初始化变量成为只读变量

不同:生成一个新的只读变量

代码版本一:

#include <stdio.h>
int main()

const int x = 1;//直接得到值,进入符号表,但是还是会为 x 分配空间,只不过这个空间 x 没有用而已
const int& rx = x;//rx代表只读变量,这个变量是编译器为x分配而没有使用的空间;引用代表变量的别名,而变量代表一段内存空间的别名,所以引用代表一段内存空间的别名
int& nrx = const_cast<int&>(rx); //消除 rx只读属性,和rx 代表的内存空间相同,同时c++里面的几种类型转换要掌握
nrx=5;
printf("x = %d",x);
printf("rx = %d",rx);
printf("nrx = %d",nrx);
printf("&x = %p",&x);
printf("&rx = %p",&rx);
printf("&nrx = %p",&nrx);

return 0;

输出结果:

root@txp-virtual-machine:/home/txp# ./a.out
x = 1
rx = 5
nrx = 5
&x = 0x7ffcc5fa8abc
&rx = 0x7ffcc5fa8abc
&nrx = 0x7ffcc5fa8abc

代码版本二:

#include <stdio.h>
int main()

volatile const int y = 2;// 只读变量,不会进入符号表
int *p = const_cast<int*>(&y);//y被 const修饰,取到的地址也有 const 属性,这里将地址只读属性去掉
*p = 8;
printf("y = %d",y);
printf("p = %p",p);
return 0;

输出结果:

root@txp-virtual-machine:/home/txp# ./a.out
y = 8
p = 0x7ffd78559684

代码版本三:

#include <stdio.h>
int main()

volatile const int y = 2;
int *p = const_cast<int*>(&y);
*p = 8;
printf("y = %d",y);
printf("p = %p",p);
const int z = y ;//只读变量
p = const_cast<int*>(&z);
*p= 9;
printf("z = %d",z);
printf("p = %p",p);
return 0;

输出结果:

root@txp-virtual-machine:/home/txp# ./a.out
y = 8
p = 0x7ffc5d651250
z = 9
p = 0x7ffc5d651254

代码版本四:

#include <stdio.h>
int main()

char c = 'c';
char& rc = c;
const int& trc = c; // char 类型默认转换为 int;const 引用初始化类型不同,将得到新的只读变量,所以改变 rc 和 trc 没有丝毫关系,从我们的输出结果可以看出来
rc = 'a';
printf("c = %c",c);
printf("rc = %c",rc);
printf("trc = %c",trc);
return 0;

结果输出:

root@txp-virtual-machine:/home/txp# ./a.out
c = a
rc = a
trc = c

二、引用的总结:

1、引用与指针有什么关系,以及如何理解"引用的本质就是指针常量"?

(1)指针是一个常量:

值为一个内存地址,不需要初始化,可以保存不同的地址

通过指针可以访问对应内存地址中的值

指针可以被const修饰成为常量或者只读变量

(2)引用只是一个变量的新名字:

对引用的操作(赋值、取地址等)都会传递到代表的变量上

const引用使其代表的变量具有只读属性

引用必须在定义时初始化,之后无法代表其它变量

(3)从使用c++语言的角度来看:

引用与指针没有任何的关系

引用是变量的新名字,操作引用就是操作对应的变量

(4)从c++编译器的角度来看:

为了支持新概念"引用"必须要一个有效的解决方案

在编译器内部,使用指针常量来实现"引用"

因此"引用"在定义时必须初始化

(5)在工程项目开发中:

当进行c++编程时,直接站在使用的角度来看待引用,与指针毫无关系,引用就是变量的别名

当对C++代码进行调试分析时,一些特殊情况,可以考虑站在C++编译器的角度来看待引用

代码实践:

版本一:

#include <stdio.h>
int a = 2;
struct SV{
int& x;
int& y;
int& z;
};
int main()

int b =4;
int* pc = new int(3) ;
SV sv = {a,b,*pc};
printf("&sv.x = %p",&sv.x);
printf("&sv.y = %p",&sv.y);
printf("&sv.z = %p",&sv.z);
delete pc;
return 0;

输出结果:

root@txp-virtual-machine:/home/txp# ./a.out
&sv.x = 0x601050
&sv.y = 0x7ffee11ba794
&sv.z = 0x1cfd010

版本二:

#include <stdio.h>
int a = 2;
struct SV{
int& x;
int& y;
int& z;
};
int main()

int b =4;
int* pc = new int(3) ;
SV sv = {a,b,*pc};
int& array[] = {a,b,*pc};//数组中的每个元素是引用就不可以;error: declaration of ‘array’ as array of references;C++ 天生要支持 C 语言,C 语言中数组中的每个元素在内存中是顺序存放的,地址是递增的,所以在 C++ 中也要兼容这个特性,而在 C++ 中唯有引用数组破快了这个特性,所以说 C++ 中不支持引用数组;&array[1] - &array[0] != Expected ==> 4
printf("&sv.x = %p",&sv.x);
printf("&sv.y = %p",&sv.y);
printf("&sv.z = %p",&sv.z);
delete pc;
return 0;

输出结果:

root@txp-virtual-machine:/home/txp# g++ test.cpp
test.cpp: In function ‘int main()’:
test.cpp:16:14: error: declaration of ‘array’ as array of references
int& array[] = {a,b,*pc};

三、总结:

指针是一个变量

引用是一个变量的新名字

const引用能够生成新的只读变量

在编译器内部使用指针常量实现"引用"

编译时不能直接确定初始值的const标识符都是只读变量

好了,今天的分享就到这里,如果文章中有错误或者不理解的地方,可以交流互动,一起进步。我是txp,下期见!

审核编辑:符乾江
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 可编程逻辑
    +关注

    关注

    7

    文章

    514

    浏览量

    44071
  • C++
    C++
    +关注

    关注

    22

    文章

    2104

    浏览量

    73482
  • CONST
    +关注

    关注

    0

    文章

    43

    浏览量

    8148
收藏 人收藏

    评论

    相关推荐

    C语言和C++结构体的区别

    同样是结构体,看看在C语言和C++中有什么区别?
    的头像 发表于 10-30 15:11 133次阅读

    C7000优化C/C++编译器

    电子发烧友网站提供《C7000优化C/C++编译器.pdf》资料免费下载
    发表于 10-30 09:45 0次下载
    <b class='flag-5'>C</b>7000优化<b class='flag-5'>C</b>/<b class='flag-5'>C++</b>编译器

    ostream在c++的用法

    ostream 是 C++ 标准库中一个非常重要的类,它位于 头文件(实际上,更常见的是通过包含 头文件来间接包含 ,因为 包含了 和 )。 ostream 类及其派生类(如 std::cout
    的头像 发表于 09-20 15:11 496次阅读

    C++实现类似instanceof的方法

    函数,可实际上C++没有。但是别着急,其实C++中有两种简单的方法可以实现类似Java的instanceof的功能。 在 C++
    的头像 发表于 07-18 10:16 528次阅读
    <b class='flag-5'>C++</b><b class='flag-5'>中</b>实现类似instanceof的方法

    要用指针怎么引用,一般在file2.c引用file1.c的字符串数组是怎么操作的?

    (RTC_SET,sizeof(RTC_SET));编译通不过;问题出在sizeof(RTC_SET)讨论:要用指针怎么引用,一般在file2.c
    发表于 05-09 08:05

    鸿蒙OS开发实例:【Native C++

    使用DevEco Studio创建一个Native C++应用。应用采用Native C++模板,实现使用NAPI调用C标准库的功能。使用C标准库hypot接口计算两个给定数平方和的平
    的头像 发表于 04-14 11:43 2491次阅读
    鸿蒙OS开发实例:【Native <b class='flag-5'>C++</b>】

    使用 MISRA C++:2023® 避免基于范围的 for 循环中的错误

    在前两篇博客,我们 向您介绍了新的 MISRA C++ 标准 和 C++ 的历史 。在这篇博客,我们将仔细研究以 C++
    的头像 发表于 03-28 13:53 733次阅读
    使用 MISRA <b class='flag-5'>C++</b>:2023® 避免基于范围的 for 循环中的错误

    c语言,c++,java,python区别

    C语言、C++、Java和Python是四种常见的编程语言,各有优点和特点。 C语言: C语言是一种面向过程的编程语言。它具有底层的特性,能够对计算机硬件进行直接操作。
    的头像 发表于 02-05 14:11 2219次阅读

    C++在Linux内核开发从争议到成熟

    Linux 内核邮件列表中一篇已有六年历史的老帖近日再次引发激烈讨论 —— 主题是建议将 Linux 内核的开发语言从 C 转换为更现代的 C++
    的头像 发表于 01-31 14:11 584次阅读
    <b class='flag-5'>C++</b>在Linux内核开发<b class='flag-5'>中</b>从争议到成熟

    C++简史:C++是如何开始的

    的 MISRA C++:2023 博客系列的第二部分。 在这篇博客,我们将深入探讨 C++ 的历史、编程语言多年来的发展历程以及它的下一步发展方向。
    的头像 发表于 01-11 09:00 528次阅读
    <b class='flag-5'>C++</b>简史:<b class='flag-5'>C++</b>是如何开始的

    C语言和C++那些不同的地方

    ++11标准。根据不同的标准,它们的功能也会有所不同,但是越新的版本支持的编译器越少,所以本文在讨论的时候使用的C语言标准是C89,C++标准是C
    的头像 发表于 12-07 14:29 902次阅读
    <b class='flag-5'>C</b>语言和<b class='flag-5'>C++</b><b class='flag-5'>中</b>那些不同的地方

    vlookup绝对引用和相对引用的区别

    公式时,相对引用会根据相对位置自动调整引用的单元格地址。如果将公式拖动到其他单元格引用的单元格地址会相应地相对移动。这是因为相对引用是相
    的头像 发表于 12-01 10:27 3555次阅读

    开箱即用!教你如何正确使用华为云CodeArts IDE for C/C++

    C/C++编码体验、方便的访问华为云资源、简单的引用华为云服务于一身,实现C/C++开发者在个人研发作业体验和效率上的巨大提升。 为了帮助
    的头像 发表于 11-29 17:40 750次阅读
    开箱即用!教你如何正确使用华为云CodeArts IDE for <b class='flag-5'>C</b>/<b class='flag-5'>C++</b>!

    如何选择创建c语言和c++

    选择创建 C 语言和 C++ 都需要综合考虑多个因素。在决定使用哪种语言之前,我们需要对这两种语言的特点、优缺点、适用场景、学习成本等进行全面的了解和对比。下面是关于选择创建 C 语言和 C+
    的头像 发表于 11-27 15:58 566次阅读

    c++怎么开始编程

    C++是一种高级的、通用的编程语言,用于开发各种类型的应用程序。它是从C语言演变而来,也是一种静态类型语言,可以在不同的平台上进行开发。C++具有高度的灵活性和性能,并且广泛应用于游戏开发、桌面
    的头像 发表于 11-27 15:56 888次阅读