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

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

3天内不再提示

C++与C的const关键字有何差别?

黄工的嵌入式技术圈 来源:黄工的嵌入式技术圈 作者:黄工的嵌入式技术 2020-02-03 14:51 次阅读

前言

在《const关键字到底该怎么用》一文中介绍了C语言中的const关键字,本文说说C++中的const关键字,它的大部分特点和C语言中的类似,所以本文主要针对不同之处。

修饰普通变量--只读

在C语言,虽然表面是不允许被修改,但是看下面的代码:

#include intmain(void) { constinta=10; int*p=&a; *p=11; printf("a=%d\n",a); return0; } 它的输出结果是a=11 所以C语言里,表面上它是只读的,然而你违规操作仍然能改变。但是,千万不要写这样的代码!!! 与C语言中const关键字不同的是,C++中使用const关键字定义的b变量的值在被改变时会被检测。 看一个例子就明白了:#include intmain() { constinta=10; int*p=&a; *p=11; return0; } 编译报错如下:main.cpp:Infunction‘intmain()’: main.cpp:5:14:error:invalidconversionfrom‘constint*’to‘int*’[-fpermissive] int*p=&a; 再次强调:在实际中千万不要写这样的代码,这里只是为了说明问题。另外它们的作用也是一样的,声明一个只读变量,不希望被修改,一旦被修改,编译器将会报错。 但是你运行下面的代码,又会有惊喜:#include voidtest(constchar*str) { char*p=(char*)str; p[0]='2'; } intmain(void) { chara[]="12345"; test(a); return0; }毕竟未定义行为常常有惊喜。 我们常常看到传递const char*参数,像这样:voidtest(constchar*str); 却似乎从来没有见到过const int作为参数的函数:voidtest(constintval); 为何?因为前者传递指针的副本,指针指向不会被改变,但可以改变指向的内容;但是int类型参数,它也是传递副本,但是永远不会被函数改变,自然也没有必要加const关键字。更多解释可以参考《传值和传指针》。 同样的,修饰函数返回值时,修饰内置类型与不加const修饰是一样的,但对于自定义类型,不能对返回值进行修改,即返回的是常量。

作用在成员函数-不改变成员变量

举个例子:

#include classTest { private: inta; public: voidprintA()const { a=10; } }; intmain() { Testtest; test.printA(); return0; } 类test中有一个成员变量a,并且有一个成员函数printA,现在假设你的设计是printA函数不会改变任何成员变量,那么你可以在printA函数后加上const关键字,这样一旦函内部尝试修改成员变量,都会报错:main.cpp:Inmemberfunction‘voidTest::printA()const’: main.cpp:9:13:error:assignmentofmember‘Test::a’inread-onlyobject a=10; 正因如此,const修饰成员函数不与static关键字同用,因为static修饰的静态成员函数不能实例化,也就没有实例的成员变量一说,自然不存在修改成员变量。 即下面的声明是非法的:staticvoidprintA()const

修饰类成员变量--构造函数中初始化

与修饰普通变量不同的是,修饰类成员变量还可以在构造函数中初始化。如:

#include classTest { private: constinta; public: Test(intval):a(val){} }; intmain() { Testtest(1); return0; }

修饰引用

例如,有一个常量

constinta=10; 你不能再这样定义它的引用:int&ref=a; 而需要定义对常量的引用,即:constint&ref=a; 为什么呢?因为不能直接为a赋值,也不能间接赋值,所以自然不能定义普通引用去间接改变它。

总结

关于const关键字在C和C++中的区别,想必到这里你已经清楚了。const关键字通常能借助编译器帮助我们提前发现一些不易察觉的问题。 如果你对下面的问题还不清楚,建议阅读《const关键字到底该怎么用》 你能分清下面的声明区别吗?

constint*p; int*constp; intconst*constp;

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

    关注

    0

    文章

    16

    浏览量

    9646
  • C语音
    +关注

    关注

    0

    文章

    12

    浏览量

    12595
  • CONST
    +关注

    关注

    0

    文章

    43

    浏览量

    8009
收藏 人收藏

    评论

    相关推荐

    C/C++代码动态测试工具VectorCAST插桩功能演示#代码动态测试 #C++

    C++代码
    北汇信息POLELINK
    发布于 :2024年04月18日 11:57:45

    关键字搜索文件夹中某个TXT文件

    文件夹中随时创造TXT文件,如何及时选出刚创造的文件?或关键字搜索出需要的TXT文件?
    发表于 02-06 15:22

    在NVM和本地\"内存中定义数组(静态 /global /local)的\"关键字是什么?

    在 NVM 和本地\"内存中定义数组(静态 /global /local)的\"关键字是什么? 还有与 32 位对齐的关键字怎么样。
    发表于 01-25 07:52

    IAR能否在整个工程中搜索关键字

    像mdk可以在整个工程中搜索关键字 IAR应该也有类似的功能吧,但是我貌似没有找到
    发表于 11-08 07:21

    指向code区数组的指针需不需要加code关键字的声明?

    指向code区数组的指针需不需要加code 关键字的声明?
    发表于 11-02 06:16

    在嵌入式中定义变量时volatile关键字的作用是什么?

    在嵌入式中定义变量时volatile关键字的作用?
    发表于 10-24 07:50

    程序中变量加volatile关键字是做什么用途的?

    为什么变量定义要加上这个关键字
    发表于 10-13 07:15

    浅析C语言中的regiseter关键字

    C语言中重要的关键字有很多,static const extern我们之前都讲过,还有一个在面试中出现的频率也比较高:register。
    的头像 发表于 08-25 17:10 833次阅读
    浅析C语言中的regiseter<b class='flag-5'>关键字</b>

    C++中常用关键字详解(2)

    C++中,volatile是一个关键字,用于修饰变量,告诉编译器该变量的值可能在程序流程之外被意外修改,因此编译器不应该对该变量进行优化(如缓存变量值或重排指令顺序)。
    发表于 08-08 16:15 190次阅读

    一起探索C++的世界!

    C++
    YS YYDS
    发布于 :2023年07月07日 19:10:25

    C语言const关键字的用法

    const是constant的简写,用来定义常量,如果一个变量被const修饰,那么它的值就不能再被改变。
    发表于 06-29 09:51 347次阅读

    C语言关键字const的几种用法

    本期来讲解一个C语言的关键字——const
    发表于 06-21 11:05 1028次阅读
    C语言<b class='flag-5'>关键字</b><b class='flag-5'>const</b>的几种用法

    第45集(9.2#100))const 关键字揭秘:超越你的认知!

    C语言
    于振南的单片机世界
    发布于 :2023年06月07日 15:07:30

    const关键字应用总结

    C++中的const关键字的用法非常灵活,而使用const将大大改善程序的健壮性
    的头像 发表于 05-26 09:06 368次阅读

    C语言|const关键字介绍

    最近看别人的项目, 发现const使用比较多, 通过使用const来保护变量, 这篇推文就来简单回顾一下相关知识!
    的头像 发表于 05-25 15:11 366次阅读