专栏首页HappenLee的技术杂谈C++雾中风景3:const用法的小结

C++雾中风景3:const用法的小结

const作为C与C++共有的关键字,很多使用的方式大同小异。但由于C++是一门面向对象的语言,在类和对象中有更多的使用规则。之前学习C语言的时候就被const这个关键字搅得焦头烂额,正巧也借这篇文章做个完整的小结。

1.const关键字:

const关键字,翻译成中文是常量,常数的意思。所以在绝大多数场合之中,const是来定义常量的,定义常量也是好的编程习惯。在C类语言之中,定义常量通常会使用宏定义或const关键字来定义常量。二者的区别就在于:

  • 1.宏定义是在预编译阶段进行文本替换,而const是在编译阶段进行代码的语义约束。
  • 2.由于二者所生效的阶段不同,所以能够起的作用也不同。const常量具有具体的类型,会在编译阶段进行类型检查,产生的代码显然会更加安全。(当然宏定义会更加灵活,可以定义代码或字符串,相对来讲如果要进行大量的宏替换,预编译时间会更长。)
  • 3.宏定义很多时候是展开给立即数,多次替换需要多次分配内存,而const可以通过全局的符号表,仅保存一份copy就完事了。

2.const的用法:

上面说了const的诸多好处,接下来我们完整的梳理一下const关键字的用法:

修饰变量

初级用法比较简单,作为一个修饰符加在变量之前就可以定义一个常量了。

const int Pi = 3.1415926;
int const Pi = 3.1415926;

这里需要强调一下,所谓的常量只是命名符对内存空间的指向被绑定,内存空间上的内容其实不是常量,依旧可以被修改。(好拗口,妈的什么意思嘛~~看代码吧)

const int Pi = 3.1415926;
int const Pi = 3.1415926;

修饰指针

这个用法就比较蛋疼了,需要记住const关键字在变量类型定义时的先后顺序。

const int* x = &y;                  //变量的指向内容不能做修改
int* const x  = &y;                 //指针指向的地址不能做修改
const int* const x  = &y;           //两者都不能做修改

大家简单记住一个口诀吧:“前限域,后限针。”

修饰引用

这个用法和指针类似,把*号换成&就行了,这里就不赘述了。

函数参数修饰

这里主要就是应用在地址传递上,在值传递的参数情况下,const没有意义。通过地址传递提高效率,同时使用const关键字来保护传递的内容不被修改。

void Fun(const A *arg);                //修饰指针型传入参数
void Fun(const A &arg);                //修饰引用型传入参数

类之中的const关键字

这部分内容是C++与C语言区别的部分,Const关键字对类之中的变量与函数都可以修饰,又涉及到之前系列文章反复涉及的权限控制,也就是封装的内容。

  • const成员变量 这个const关键字在修饰成员变量时,与上文提及的使用雷同,const变量在初始化列表中赋值,并且不能进行修改。
    class object
    { 
        …
        const int value;         //const变量不能被修改 (int const value也可以)
        …
        object (int x): value(x) { } ; //构造函数初始化const变量
     } 
  • const成员函数 const成员函数是让我最感兴趣的编程逻辑,简单来说,这是一个带函数式编程逻辑的一种使用方式。简而言之,const修饰的成员函数没有副作用,不能修改对象的成员内容,如果需要修改,就需要生成新的对象。
    class object
    { 
        …
        int value;        
        …
        void test() const {
                value = 20; //编译错误,const函数不能修改对象之中的成员变量,也不能调用其他非const函数。
        } 
  • const对象 const关键字可以在对象初始化时候作为修饰,const关键字修饰的对象称之为常量对象。常量对象所有成员默认添加了const修饰字,也就是所有的成员变量都不能进行修改。我们可以认为是关闭了写权限,所以const对象只能调用const成员函数,非const成员函数都有修改成员变量的权限。
    class object
    { 
        …
        int value;        
        …
        void test() const {
        } 

       int main() {
        const object obj;  
      }

3.非C++语言是怎么解决常量问题的:

  • Java final修饰符
    • 修饰变量时与const关键字效果雷同;
    • 修饰函数或类时,代表子类不能override的子类不能继承;
  • Scala
    • var 修饰符代表变量。
    • val 修饰符代表常量。
  • Python 老子他喵的没有常量,全靠大写字母自觉。 (任性自由的Python~~)
  • Golang C语言的亲兄弟,const关键字与C与C++基本区别不大,读者可以之行总结。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • ClickHouse源码笔记1:聚合函数的实现

    聚合函数: 顾名思义就是对一组数据执行聚合计算并返回结果的函数。 这类函数在数据库之中很常见,如:count, max, min, sum等等。

    HappenLee
  • Linux下双网卡Firewalld的配置流程

    实验室拟态存储的项目需要通过LVS-NAT模式通过LVS服务器来区隔内外网的服务,所以安全防护的重心则落在了LVS服务器之上。笔者最终选择通过firewalld...

    HappenLee
  • C++雾中风景1:友元类与面向对象

    开篇先简单介绍一下友元这个概念吧。 在C++之中,类的友元函数是定义在类外部,但它有权访问类的所有私有(private)成员和保护(protected)成员。...

    HappenLee
  • Effective C++条款3 我可以不使用const?

    const是C++中用得非常频繁的一个关键字,但是如果你不使用这个关键字,对程序的运行结果影响不大,那么,我可以不使用const吗?

    ACM算法日常
  • QMap容器小知识

    Qt君
  • 学习c++中的小问题总结

    徐飞机
  • 初级程序员面试不靠谱指南(二)

    3.read-only的const。如果你突然冒出一句看似很高深的话但又不解释一般都是装逼,就像前面提到过const准确的应该理解为一个read-only的变量...

    一心一怿
  • const特性总结(不断更新)

    作者:bakari  时间:2012.6.5 1、指向const对象的指针---const int *cptr; i、在此,cptr是指向int类型的const...

    CloudDeveloper
  • 我在大厂写React,学到了什么?

    我工作中的技术栈主要是 React + TypeScript,这篇文章我想总结一下如何在项目中运用 React 的一些技巧解决一些实际问题,本文中使用的代码都是...

    ssh1995
  • 手把手教你开发人工智能微信小程序(4): 训练手写数字识别模型

    在上篇文章《手把手教你开发人工智能微信小程序(3):加载数据》中,我给大家演示了如何通过fetch加载网络数据并进行数据归范化,出于演示的目的,例子做了简化处理...

    云水木石

扫码关注云+社区

领取腾讯云代金券