C语言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++基本区别不充分,读者可以的实施总结。