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 x = 1;
int *y = (int *)&i;
*p = 2;

修饰指针

这个用法就比较蛋疼了,需要记住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++基本区别不大,读者可以之行总结。

C++雾中风景3:const用法的小结的更多相关文章

  1. c++ const用法小结

    const用法 1,定义全局变量的内存分配问题 #define  Pi_1  3.14       //使用#define宏 const double Pi_2 = 3.14    //使用const ...

  2. static 与单例模式、auto_ptr与单例模式、const 用法小结、mutable修饰符

    一.static 与单例模式 单例模式也就是简单的一种设计模式,它需要: 保证一个类只有一个实例,并提供一个全局访问点 禁止拷贝  C++ Code  1 2 3 4 5 6 7 8 9 10 11 ...

  3. const用法

    一.const作用 二.const用法 1.修饰一般常量   修饰符const可以用在类型说明符前,也可以用在类型说明符后. 例如: ; ; 2.修饰常数组  修饰符const可以用在类型说明符前,也 ...

  4. 【转】话说C语言const用法

    原文:话说C语言const用法 const在C语言中算是一个比较新的描述符,我们称之为常量修饰符,意即其所修饰的对象为常量(immutable). 我们来分情况看语法上它该如何被使用. 1.函数体内修 ...

  5. const用法详解(转)

    http://www.cnblogs.com/StudyRush/archive/2010/10/06/1844690.html 面向对象是C++的重要特性. 但是c++在c的基础上新增加的几点优化也 ...

  6. C++之常指针,指针常量,函数指针,const用法总结

    1.const char *p,char const *p,char * const p 对于C++而言,没有const * 修饰符,所以,const只可以修饰类型或者变量名.因而const char ...

  7. C++ const用法小结 (欢迎大家拍砖)

    C++const 关键字小结 const 是constant的缩写,本意是不变的,不易改变的意思. const 在C++中是用来修饰内置类型变量,自定义对象,成员函数,返回值,函数参数. 一.cons ...

  8. const用法小结

    const与指针 char *const p --> char *(const p) --> 指针常量 char const *p --> char (const *p) --> ...

  9. C#中的readonly跟const用法小结

    总结一下常量和只读字段的区别: 由来: 笔者也是在看欧立奇版的<.Net 程序员面试宝典>的时候,才发现自己长久以来竟然在弄不清出两者的情况下,混用了这么长的时间.的确,const与rea ...

随机推荐

  1. Ubuntu15.04 网站服务器环境搭建,php/html/css等学习环境搭建教程

    ---恢复内容开始--- 本文部分参考自:http://www.cnblogs.com/emouse/archive/2013/06/07/3124009.html 原文中存在少量错误,已改正. 首先 ...

  2. ASP.NET Core 网站发布到Linux服务器(转)

    出处;ASP.NET Core 网站发布到Linux服务器 长期以来,使用.NET开发的应用只能运行在Windows平台上面,而目前国内蓬勃发展的互联网公司由于成本的考虑,大量使用免费的Linux平台 ...

  3. 【转】话说C语言const用法

    原文:话说C语言const用法 const在C语言中算是一个比较新的描述符,我们称之为常量修饰符,意即其所修饰的对象为常量(immutable). 我们来分情况看语法上它该如何被使用. 1.函数体内修 ...

  4. .net 面试题

    1.列举ASP.NET页面之间传值的几种方式. 答:使用QueryString,如.../id=1;response.Redirect() 使用Session 使用Server.Transfer 使用 ...

  5. LINUX 笔记-ls命令

    常用参数: -l :列出长数据串,包含文件的属性与权限数据等 -a :列出全部的文件,连同隐藏文件(开头为.的文件)一起列出来(常用) -d :仅列出目录本身,而不是列出目录的文件数据 -h :将文件 ...

  6. ALV添加文字输入框

    一.业务场景 在合同打印中,需要临时添加其他约定事项,在打印程序的ALV中添加其他事项字段,点击之后弹出文字输入窗口,点击确定,文字内容存表,并在ALV中展示,点击打印后,文字内容加载到smartfo ...

  7. 我的第一个python web开发框架(13)——工具函数包说明(四)

    string_helper.py是字符串操作包,主要对字符串进行检查.过滤和截取等处理. #!/usr/bin/evn python # coding=utf-8 import re def chec ...

  8. jquery的2.0.3版本源码系列(7):3043行-3183行,deferred延迟对象,对异步的统一管理

    目录 part1 deferred延迟对象 part2  when辅助方法 网盘源代码 链接: https://pan.baidu.com/s/1skAj8Jj 密码: izta part1 defe ...

  9. 排序算法总结(C++版)

    总结下学过的排序算法,方便以后用到. 1.插入排序——将一个记录插入到已排序好的有序表中,从而得到一个新,记录数增1的有序表. void insertSort(int a[],int len) { ; ...

  10. iOS 输入时键盘处理问题

    最正规的办法,用通知 step 1:在进入视图的时候添加监视:(viewDidLoad什么的) //监听键盘的通知 [[NSNotificationCenter defaultCenter] addO ...