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

    浏览量

    10833
  • C语音
    +关注

    关注

    0

    文章

    12

    浏览量

    12880
  • CONST
    +关注

    关注

    0

    文章

    45

    浏览量

    8683
收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    C++程序异常的处理机制

    语法 C++异常处理涉及到3个关键字: throw---抛出一个异常,带参数 try---用于标识可能会出现异常的代码段 catch--是用于标识异常处理的代码段 下面以一个例子来说明它们
    发表于 12-02 07:12

    Temu跨境电商按关键字搜索Temu商品API的应用及接口请求示例

    Temu跨境电商按关键字搜索Temu商品API的应用及接口请求示例 Temu跨境电商按关键字搜索Temu商品API的应用场景 Temu跨境电商平台按关键字搜索Temu商品API的主要应用场景包括但不
    的头像 发表于 11-29 15:08 102次阅读

    C语言的编程技巧

    、_Alignas关键字‌:C11标准引入了_Alignas关键字,用于显式指定类型的对齐方式,优化内存访问效率。 ‌5、_Generic关键字‌:
    发表于 11-27 06:46

    哪些场合会用到volatile关键字?

    当你理解 volatile关键字的含义之后,你就能明白,其实很多场合都能用到 volatile关键字。 1.全局变量单片机开发,难免会用到全局变量。一些初级工程师,更是全局变量满天飞。这种情况下
    发表于 11-25 08:19

    天眼查平台关键字搜索企业数据API接口技术指南

    ​ 一、接口概述 天眼查提供的企业搜索API接口,支持通过关键字查询企业工商信息、经营状态等核心数据。该接口采用RESTful架构,返回JSON格式数据。 二、接口认证 调用需使用API密钥认证
    的头像 发表于 11-21 11:48 389次阅读
    天眼查平台<b class='flag-5'>关键字</b>搜索企业数据API接口技术指南

    亚马逊平台根据关键字搜索商品API接口

    ​  在电商开发中,集成亚马逊平台的商品搜索功能是常见需求。通过亚马逊的Product Advertising API(PAAPI),开发者可以根据关键字高效检索商品信息。本技术帖将逐步介绍如何调用
    的头像 发表于 11-05 15:00 124次阅读
    亚马逊平台根据<b class='flag-5'>关键字</b>搜索商品API接口

    micro 关键字搜索全覆盖商品,并通过 API 接口提供实时数据

    micro 关键字搜索全覆盖商品”并通过 API 接口提供实时数据
    的头像 发表于 07-13 10:13 694次阅读

    在OpenVINO™ C++代码中启用 AddressSanitizer 时的内存泄漏怎么解决?

    在 OpenVINO™ C++代码中启用 AddressSanitizer 时遇到内存泄漏: \"#0 0xaaaab8558370 in operator new(unsigned
    发表于 06-23 07:16

    《ESP32S3 Arduino开发指南》第三章 C/C++语言基础

    需要注意:① case后带的表达式一定要是常数,并且是整型。②在语句后面通常是break关键字。③ 最后一般default,即前面case没有一个符合的情况,就会调到default里执行。虽然说
    发表于 06-10 09:20

    主流的 MCU 开发语言为什么是 C 而不是 C++

    在单片机的地界儿里,C语言稳坐中军帐,C++想分杯羹?难喽。咱电子工程师天天跟那针尖大的内存空间较劲,C++那些花里胡哨的玩意儿,在这儿真玩不转。先说内存这道坎儿。您当stm32f4的256kRAM
    的头像 发表于 05-21 10:33 780次阅读
    主流的 MCU 开发语言为什么是 <b class='flag-5'>C</b> 而不是 <b class='flag-5'>C++</b>?

    单片机编程关键字之volatile

    volatile 修饰的变量是说这变量可能会被意想不到地改变。通常对于程序员而言,单片机 中用的就算常见了volatile 是易变的,不稳定的意思。其实对于很多人来说,根本没见过这个关键字,不 知道
    发表于 04-02 13:47 2次下载

    带你在单片机编程中熟练使用const(可下载)

    C 语言关键字const 举足轻重,我们今天就深度聊一聊 const 的定义和实际应用,让它 不再是迷C 语言中
    发表于 04-01 14:18 3次下载

    基于OpenHarmony标准系统的C++公共基础类库案例:ThreadPoll

    1、程序简介该程序是基于OpenHarmony标准系统的C++公共基础类库的线程池处理:ThreadPoll。本案例完成如下工作:创建1个线程池,设置该线程池内部1024个线程空间。启动5个线程
    的头像 发表于 02-10 18:09 601次阅读
    基于OpenHarmony标准系统的<b class='flag-5'>C++</b>公共基础类库案例:ThreadPoll

    const定义的是不是常量

    变成数字 5。 第二种跟宏定义类似,常量也可以在编译的时候通过编译器传入。 以 gcc 为例,编译的时候提供 -D 选项,同样会在预处理的时候替换成相应的数字。 第三种枚举,使用 enum 关键字。 枚举的特点是默认从 0 开始,逐渐递增。如果需要大量含义相同的常量
    的头像 发表于 01-14 11:35 655次阅读

    Spire.XLS for C++组件说明

    Spire.XLS for C++ 是一款专业的 C++ Excel 组件,可以用在各种 C++ 框架和应用程序中。Spire.XLS for C++ 提供了一个对象模型 Excel
    的头像 发表于 01-14 09:40 1300次阅读
    Spire.XLS for <b class='flag-5'>C++</b>组件说明