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. 笔记-git-.gitignore

    笔记-git-.gitignore 1.      git忽略文件 有的文件不需要提交到公共仓库中,为此git提供了三种实现方式. gitignore文件 在项目的设置中指定排除文件 定义全局.git ...

  2. 零基础学css第二天

    内边距与外边距: <!DOCTYPE html> <html> <head> <title></title> <style type= ...

  3. linux c 调用子文件函数

    今天在学习初级linux c的时候遇到了如下问题:通过主函数调用同路径下的子文件函数调用失败.博主是这样一一解决的: 首先:hello.c: hello.c: #include<bool.c&g ...

  4. 05,Python网络爬虫之三种数据解析方式

    回顾requests实现数据爬取的流程 指定url 基于requests模块发起请求 获取响应对象中的数据 进行持久化存储 其实,在上述流程中还需要较为重要的一步,就是在持久化存储之前需要进行指定数据 ...

  5. TopCoder SRM 710 Div2 Hard MinMaxMax Floyd最短路变形

    题意: 有一个无向连通图,没有重边没有自环,并给出顶点的权值和边的权值 定义一条路径\(difficulty\)值为该路径上最大的点权乘上最大的边权 定义函数\(d(i,j)\)为\(i,j\)之间的 ...

  6. luogu4196 [CQOI2006]凸多边形 半平面交

    据说pkusc出了好几年半平面交了,我也来水一发 ref #include <algorithm> #include <iostream> #include <cstdi ...

  7. 嵌入式(Embedded System)笔记 —— Cortex-M3 Introduction and Basics(下)

    随着课内的学习,我想把每节课所学记录下来,以作查阅.以饲读者.由于我所上的是英文班课程,因此我将把关键术语的英文给出,甚至有些内容直接使用英文. 本次所介绍内容仍是关于Cortex-M3的基础内容,相 ...

  8. Python 3基础教程4-变量

    本文介绍变量,什么是变量呢,可以这样理解:变量是一个容器,这个容器可以用来存储值,而且可以被其他对象引用. 看看下面的demo.py # 这里介绍 变量 # 变量可以是数字var1 = 5print( ...

  9. Robot Framwork +Selenium2环境搭建

    Robot Framwork +Selenium2环境搭建 安装python 参考文章http://blog.csdn.net/sealion111/article/details/78690686 ...

  10. FTP2

    FTP: 环境:windows, python 3.5功能:1.用户加密认证,可自行配置家目录磁盘大小2.多用户登陆3.查看当前目录(家目录权限下)4.切换目录(家目录权限下)5.上传下载,进度条展示 ...