1、修饰常量时:

  const int temp1;  //temp1为常量,不可变

  int const temp2;  //temp2为常量,不可变

2、修饰指针时:

  主要看const在*的前后,在前则指针指向的内容为常量,在后则指针本身为常量;

  const int *ptr;   //*ptr为常量;

  int const *ptr;   //*ptr为常量;

  int* const ptr;   //ptr为常量;

  const int * const ptr;   //*ptr、ptr均为常量;

3、const修饰类对象时:

  const修饰类对象时,其对象中的任何成员都不能被修改。const修饰的对象,该对象的任何非const成员函数都不能调用该对象,因为任何非const成员函数都会有修改成员变量的可能。

  class TEMP{

    void func1();

    void func2() const;

  }

  const TEMP temp;

  temp.func1();  //错误;

  temp.func2();  //正确;

4、const修饰成员变量:

  const修饰的成员变量不能被修改,同时只能在初始化列表中被初始化,因为常量只能被初始化,不能被赋值;

  赋值是使用新值覆盖旧值构造函数是先为其开辟空间然后为其赋值,不是初始化;而初始化列表开辟空间和初始化是同时完成的,直接给与一个值,所以const成员变量一定要在初始化列表中完成。

  class TEMP{

    const int val;

    TEMP(int x)val(x){};   //只能在初始化列表中赋值;

  }

5、const修饰类的成员函数

  const成员函数表示该成员函数不能修改类对象中的任何非const成员变量。一般const写在函数的后面,形如:void func() const;

  如果某个成员函数不会修改成员变量,那么最好将其声明为const,因为const成员函数不会对数据进行修改,如果修改,编译器将会报错;

  class TEMP{

    void func()const;  //常成员函数,不能修改对象中的成员变量,也不能调用类中任何非const成员函数;

  }

  对于const类对象,只能调用类中的const成员函数,所以const修饰成员函数的作用主要就是限制对const对象的使用。

6、const在函数声明中的使用:

  在函数声明中,const可以修饰函数的返回值,也可以修饰具体某一个形参;

  修饰形参时,用相应的变量初始化const常量,在函数体内,按照const所修饰的部分进行常量化;

  修饰函数返回值时,一般情况下,const修饰返回值多用于操作符的重载。通常不建议用const修饰函数的返回值类型为某个对象或某个对象引用的情况;

7、const常量与define宏定义的区别:

  1)处理阶段不同:

  define是在预处理阶段,define常量从未被编译器看见,因为在预处理截断就已经替换了;

  const常量在编译阶段使用。

  2)类型和安全检查不同

  define没有类型,不做任何检查,仅仅是字符替换,没有类型安全检查,并且在字符替换时可能会产生意料不到的错误

  const常量有明确的类型,在编译阶段会进行类型检查;

  3)存储方式不同

  define是字符替换,有多少地方使用,就会替换多少次,不会分配内存;

  编译器通常不会为const常量分配空间,只是将它们保存在符号表内,使他们成为一个编译期间的一个常量,没有读取内存的操作,效率也很高;

8、mutable关键字:

  在C++中,mutable是为了突破const的限制而设置的。被mutable修饰的变量,将永远处于可变的状态,即使在一个const函数中,甚至结构体变量或者类对象为const,其mutable成员也可以被修改:

  class ST {
    public:
    int a;
    mutable int showCount;
    void Show()const;
  };

  void ST::Show()const{
    //a=1;//错误,不能在const成员函数中修改普通变量
    showCount++;//正确
  }

  mutable只能修饰非静态数据成员;

9、const_cast:

  用于修改类型的const或volatile属性。

  用法:

  :const_cast<type_id> (expression)
  该运算符用来修改类型的const或volatile属性。除了const 或volatile修饰之外, type_id和expression的类型是一样的。
  1)常量指针被转化成非常量的指针,并且仍然指向原来的对象;
  2)常量引用被转换成非常量的引用,并且仍然指向原来的对象;
  3)const_cast一般用于修改底指针。如const char *p形式。
 
建议:
  1、应该尽可能使用const,它会允许你指定一个语义约束(也就是指定一个不能被改动的对象),而编译器会强制实施这项约束。它允许你告诉编译器和其他程序员某值应该保持不变。
  2、将某些东西声明为const可帮助编译器侦测出错误用法。const可被施加于任何作用域内的对象、函数参数、函数返回类型、成员函数本体;
  3、编译器强制实施bitwise constness,但你编写程序时应该使用“概念上的常量性”(conceptual constness);
  4、当const和non_const成员函数有着实质等价的实现时,令non-const版本调用const版本可避免代码重复;

c/c++中const用法总结的更多相关文章

  1. C++中const用法详解

    本文主要内容来自CSDN论坛: http://bbs.csdn.net/topics/310007610 我做了下面几点补充. 补充: 1. 用const声明全局变量时, 该变量仅在本文件内可见, 类 ...

  2. 【c++】C++中const用法总结

    1.      const常量,如const int max = 100; 优点:const常量有数据类型,而宏常量没有数据类型.编译器可以对前者进行类型安全检查,而对后者只进行字符替换,没有类型安全 ...

  3. C++中const用法总结

    1修饰变量/指针 注意以下几种修饰的区别: (1)const int * a; (2)int const *a; (3)int * const b; (4)int const* const c; 其中 ...

  4. C++中const用法

    1.const和指针: 如果const出现在星号左边,表示被指物是常量:如果出现在星号右边,表示指针自身是常量:如果出现在星号两边,表示被指物和指针两者都是常量. char greet[] = “He ...

  5. C/C++中const的用法 分类: C/C++ 2015-07-05 00:43 85人阅读 评论(0) 收藏

    const是C语言的关键字,经C++进行扩充,变得功能强大,用法复杂.const用于定义一个常变量(只读变量),当const与指针,引用,函数等结合起来使用时,情况会变得复杂的多.下面将从五个方面总结 ...

  6. C++中const 的各种用法

    C++中const 关键字的用法 const修饰变量 const 主要用于把一个对象转换成一个常量,例如: ; size = ; // error: assignment of read-only v ...

  7. C++中const简介及用法

    1.const简介 C++中的const关键字的用法非常灵活,而使用const将大大改善程序的健壮性,本人根据各方面查到的资料进行总结如下,期望对朋友们有所帮助. Const 是C++中常用的类型修饰 ...

  8. C/C++ 中 const 修饰符用法总结

    C/C++ 中 const 修饰符用法总结 在这篇文章中,我总结了一些C/C++语言中的 const 修饰符的常见用法,供大家参考. const 的用法,也是技术性面试中常见的基础问题,希望能够帮大家 ...

  9. C++ 中 const、volatile、mutable的用法

    @2019-01-14 [小记] C++中const.volatile.mutable的用法

随机推荐

  1. 笔记-python操作mysql

    笔记-python操作mysql 1.      开始 1.1.    环境准备-mysql create database db_python; use db_python; create tabl ...

  2. BP神经网络的手写数字识别

    BP神经网络的手写数字识别 ANN 人工神经网络算法在实践中往往给人难以琢磨的印象,有句老话叫“出来混总是要还的”,大概是由于具有很强的非线性模拟和处理能力,因此作为代价上帝让它“黑盒”化了.作为一种 ...

  3. 图的最短路径:Dijkstra 和 Floyd

    //最短路径 /* dijkstra Dijkstra(迪杰斯特拉)算法的核心思想是贪心策略+动态规划 http://www.programgo.com/article/4721147659/ Dij ...

  4. 1、shader简介、渲染管线

    vs对于shader的插件:http://blog.shuiguzi.com/shaderlabvs-release-page.html 计算机有一块重要的组成部分,就是“显卡”,大家玩游戏的话,肯定 ...

  5. Python网络编程(OSI模型、网络协议、TCP)

    前言: 什么是网络? 网络是由节点和连线构成,表示诸多对象及其相互联系. 在数学上,网络是一种图,一般认为专指加权图. 网络除了数学定义外,还有具体的物理含义,即网络是从某种相同类 型的实际问题中抽象 ...

  6. Python全栈工程师(数值类型、运算符)

    ParisGabriel       Python 入门基础     python的应用领域: 1.系统运维 2.网络编程(如:网络爬虫,搜索引擎,服务器编程) 3.科学计算 4.航空领域(如:卫星, ...

  7. Ubuntu16.04安装openCV的问题集合

    Q1 下列软件包有未满足的依赖关系:   libtiff4-dev : 依赖: libjpeg-dev  E: 无法修正错误,因为您要求某些软件包保持现状,就是它们破坏了软件包间的依赖关系. 上网查了 ...

  8. 【linxu】部署docker容器虚拟化平台

    实验所涉内容 Docker 概述 部署 docker 容器虚拟化平台 docker 平台基本使用方法 创建docker镜像和发布镜像方法 Container 容器端口映射 一 Docker 概述 Do ...

  9. 【bzoj2238】Mst 最小生成树+树链剖分+线段树

    题目描述 给出一个N个点M条边的无向带权图,以及Q个询问,每次询问在图中删掉一条边后图的最小生成树.(各询问间独立,每次询问不对之后的询问产生影响,即被删掉的边在下一条询问中依然存在) 输入 第一行两 ...

  10. 常用shell脚本命令

    常用shell脚本命令 1.显示包含文字aaa的下一行的内容: sed -n '/aaa/{n;p;}' filename 2.删除当前行与下一行的内容: sed -i '/aaa/{N;d;}' f ...