zoukankan      html  css  js  c++  java
  • C++中的const

    一,C++中const的基本知识

    1.C++中const的基本概念

      1.const是定义常量的关键字,表示只读,不可以修改。

      2.const在定义常量的时候必须要初始化,否则报错,因为常量无法修改,只能在定义的时候才可以进行初始化。

    2.C++中const的基本用法

     1 # include<iostream>
     2 
     3 int main()
     4 {
     5     // 表示一个整数常量
     6     const int a = 10;
     7     
     8     // 表示一个整数常量
     9     int const b = 20;
    10     
    11     // 必须在定义定义常量的时候立即进行初始化
    12     // int const c; 该语句报错,因为未进行初始化
    13 
    14     // 表示该指针指向的是一个常量,该指针是一个变量。不可以通过指针间接修改常量的值
    15     const int * c;
    16     c = &a;
    17     // *c = 100; 该语句错误,在C++中不允许通过指针间接修改常量的值(在C中是可以的)
    18 
    19     // 表示一个常指针,该指针是一个常量,必须要立即初始化,该指针的值一旦初始化就不允许再修改
    20     int d = 100;
    21     int f = 200;
    22     int * const e = &d;
    23     // e = &f; 该语句错误,因为常指针不允许修改
    24 
    25     // 表示一个指向常量的常指针,该常指针的值不允许修改,该常指针指向的内存空间的值也不允许修改
    26     const int * const g = &d;
    27     // g = &f; 该语句错误,常指针不允许被修改
    28     // *g = 20; 该语句错误,因为该指针指向的是一个常量,无法间接修改该值
    29 
    30     return 0;
    31 }

    3.const的易混点的区分以及作函数参数的好处

    1.const的易混点

      1.常指针:该指针变量是常量,因此叫做常指针,例如:int * const tmp = &a;

      2.指向常量的指针:该指针是变量,但是指向的内存空间是常量的内存空间,不允许通过间接赋值的方式改变该内存空间的值。例如:const int * tmp = &b;

      3.指向常量的常指针:该指针是常量,该指针指向的内存空间也是常量,即不允许修改指针的值,也不允许间接修改指针指向内存空间的值,例如:const int * const tmp = &b;

    2.const作函数参数的好处

      1.清楚的区分参数是输入还是输出。

      2.保护原始数据不被函数内部修改,例如:void setName(const char * name);

    二,C++的const的原理

    1.C语言中的冒牌货-const

      1.C语言中的const是可以通过指针间接赋值的方式改变常量的值,因此C语言中的const是允许被修改,不是真正意义上的常量。因此是冒牌货。

    2.C++编译器对const的处理

      1.C++的编译器碰见常量声明的时候,会在符号表中把该常量放进去。

      2.编译过程中若发现使用常量,则直接以符号表中的值进行替换。

      3.编译过程中若发现对常量进行了&地址操作,则为该常量分配内存空间(兼容C)。

      4.C++编译器虽然可能为常量分配内存空间,但不会使用其存储空间中的值。

    三,const和#define的区别

    1.两者的区别

      1.C++中的const类似于宏定义。

      2.C++中的const是由编译器进行处理的,提供类型检查和作用域检查。宏定义是由预处理器处理,单纯的文本替换而已。

  • 相关阅读:
    hive.exec.parallel参数
    MySQL FEDERATED 提示
    mapreduce作业单元测试
    linux 更改mysql的数据库目录
    SQL Server 2008数据库邮件配置及应用
    mysql主键大小写不敏感的解决办法
    java遍历hashMap、hashSet、Hashtable
    Linux下命令行显示当前全路径方法
    通过SQL Server操作MySQL的步骤和方法
    Linux shell获取时间和时间间隔(ms级别)
  • 原文地址:https://www.cnblogs.com/metalsteel/p/6242523.html
Copyright © 2011-2022 走看看