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

    浏览量

    9814
  • C语音
    +关注

    关注

    0

    文章

    12

    浏览量

    12645
  • CONST
    +关注

    关注

    0

    文章

    44

    浏览量

    8163
收藏 人收藏

    评论

    相关推荐

    C语言关键字分别发生在哪个阶段

    在编译的第一个阶段:预处理,对一些宏定义做替换。 第二个,constC语言中的 const 用于修饰只读变量,表示变量本身不能修改。 这个关键字会在编译的第二步起作用,也就是编译。
    的头像 发表于 11-24 10:31 181次阅读

    C++新手容易犯的十个编程错误

    简单的总结一下 C++ 新手容易犯的一些编程错误,给新人们提供一个参考。 1 有些关键字在 cpp 文件中多写了 对于 C++ 类,一些关键字只要写在 .h 中就好,cpp 中就不用再
    的头像 发表于 11-15 12:42 348次阅读

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

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

    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 256次阅读

    使用边缘AI和Sitara处理器进行关键字检测

    电子发烧友网站提供《使用边缘AI和Sitara处理器进行关键字检测.pdf》资料免费下载
    发表于 09-02 11:30 0次下载
    使用边缘AI和Sitara处理器进行<b class='flag-5'>关键字</b>检测

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

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

    快速掌握C语言关键字

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

    嵌入式C语言面试大挑战

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

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

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

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

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

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

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

    vb语言和c++语言的区别

    Microsoft开发的一种面向对象的事件驱动编程语言。它的设计目标是简化编程过程,让初学者也能快速上手。与之相比,C++语言是一种通用的、面向对象的编程语言,其设计目标是提供高性能的系统级编程。 语法: VB语言的语法较为简单,使用了很多可读性强的关键词,如“
    的头像 发表于 02-01 10:20 2306次阅读

    在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 591次阅读
    <b class='flag-5'>C++</b>简史:<b class='flag-5'>C++</b>是如何开始的