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++基本区别不深,读者可的履总结。