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

    浏览量

    9808
  • C语音
    +关注

    关注

    0

    文章

    12

    浏览量

    12632
  • CONST
    +关注

    关注

    0

    文章

    43

    浏览量

    8139
收藏 人收藏

    评论

    相关推荐

    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>编译器

    C语言关键字--typedef

    C语言关键字使用方法学习指南!
    的头像 发表于 10-07 12:44 138次阅读

    C++中实现类似instanceof的方法

    C++多态与继承,但是很多人开始学习C++,有时候会面临一个常见问题,就是如何向下转型,特别是不知道具体类型的时候,这个时候就希望C++ 可以向Java或者Python中有insta
    的头像 发表于 07-18 10:16 475次阅读
    <b class='flag-5'>C++</b>中实现类似instanceof的方法

    快速掌握C语言关键字

    C语言中的32个关键字你知道多少个呢?根据关键字的作用分为四类:数据类型关键字、控制语句关键字、存储类型
    的头像 发表于 07-06 08:04 268次阅读
    快速掌握<b class='flag-5'>C</b>语言<b class='flag-5'>关键字</b>

    嵌入式C语言面试大挑战

    C++中static关键字除了具有C中的作用还有在类中的使用在类中,static可以用来修饰静态数据成员和静态成员方法静态数据成员
    发表于 03-05 14:18 267次阅读
    嵌入式<b class='flag-5'>C</b>语言面试大挑战

    简单总结一下嵌入式C++中常见的错误形式

    对于 C++ 类,一些关键字只要写在 .h 中就好,cpp 中就不用再加上了,比如 virtual、static 等关键字,如果在 cpp 中多写,编译器会报错。
    的头像 发表于 02-23 09:40 401次阅读

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

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

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

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

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

    MISRA C++:2023,MISRA® C++ 标准的下一个版本,来了!为了帮助您做好准备,我们介绍了 Perforce 首席技术支持工程师 Frank van den Beuken 博士撰写
    的头像 发表于 01-11 09:00 501次阅读
    <b class='flag-5'>C++</b>简史:<b class='flag-5'>C++</b>是如何开始的

    基于C/C++面向对象的方式封装socket通信类

    在掌握了基于 TCP 的套接通信流程之后,为了方便使用,提高编码效率,可以对通信操作进行封装,本着浅入深的原则,先基于 C 语言进行面向过程的函数封装,然后再基于 C++ 进行面向
    的头像 发表于 12-26 09:57 1256次阅读

    你还记得这个C语言关键字吗?

    当你使用volatile关键字时,你告诉编译器该变量的值可能会在程序的执行过程中被外部因素更改,因此编译器不应该对该变量的读写进行优化。下面是一些使用volatile的例子,以及对它们的一些文字描述
    的头像 发表于 12-17 08:00 318次阅读
    你还记得这个<b class='flag-5'>C</b>语言<b class='flag-5'>关键字</b>吗?

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

    C语言虽说经常和C++在一起被大家提起,但可千万不要以为它们是一个东西。现在我们常用的C语言是C89标准,C++
    的头像 发表于 12-07 14:29 869次阅读
    <b class='flag-5'>C</b>语言和<b class='flag-5'>C++</b>中那些不同的地方

    vlookup提取关键字匹配多个结果

    是它能够基于关键字匹配提取多个结果。 当使用VLOOKUP提取多个结果时,需要遵循以下几个重要步骤。首先,您需要确保数据的组织和结构正确。数据应以表格格式排列,左侧为关键字列,右侧为相应的信息列。 首先,让我们考虑一个实际的例子。假设您有一个大型数据集
    的头像 发表于 12-01 10:40 2251次阅读

    static关键字的三种用法

    C语言中,关键字"static"可以用于不同的上下文,具有不同的作用。以下是"static"在C语言中的主要作用:1.静态
    的头像 发表于 11-10 08:00 470次阅读
    static<b class='flag-5'>关键字</b>的三种用法

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

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