在C++中,const 这个关键字用法非常灵活,导致我总会搞不清作用是干啥的。灵活使用const会大大改善程序。

const 是C++的一种类型修饰符,是不可改变的不能被更新的。

1.const 修饰成员变量

  const int a = 1;  此时的a在后面的操作中不能被改变,否则会报错

2.const 修饰函数参数

  (1)void f( const int i ){}    防止意外的修改,增强程序的健壮性,同样在函数内不能被修改

  

  (2)void f(const int* i){}  指针所指的内容为常量不可变

  

  (3)void f(int* const i){}  指针本身为常量不可变

  

  (4)void f(const int& i){}  引用参数在函数内不可以改变

3.const 与指针搭配

  (1)int* const a;  指针本身是常量不可变

  (2)const int* a;  指针指向的内容是常量,不可变

  (3)const int* const a;  两者都不能改变

区别的方法:

  以*为分割线,如果 const 位于 * 的左侧,那么那个const就是用来修饰指针所指向的变量,也就是指针为常量。

  const 位于*右侧的时候,const 就是修饰指针本身,也就是指针本身是常量

4.const 修饰函数的返回值

  (1) const int f(){}  返回的参数是常量(没有什么意义,因为返回的参数本来就是常量)

  (2)const int * f() {}  调用的时候相当于 const int *p = f();  即指针内容不可变

  (3)int* const f(){}  调用的时候相当于 int * const p = f();  指针本身不可变

5.在类中的运用

  (1)修饰成员变量  就是不能被修改,只能在初始化列表中赋值

  (2)修饰成员函数

class MyClass
{
...
void a()const{}  //常成员函数,不改变对象的成员变量(不能修改任何成员变量)

        //在这个函数中,不能调用非const 成员函数,因为非const 成员函数可能会修改成员变量
};

  (3)修饰对象

  const 修饰的类对象中,表示该对象为常量对象,其中的任何成员都不能被修改。对于对象指针和对象引用也是一样的。

  还有const 修饰的对象只能调用const 修饰的成员函数,因为非const修饰的函数都有可能修改成员变量。

5.将const 类型转化为非const 类型

方法:采用const_cast 进行转换

即 const_cast<type_id> (expression)

常量指针被转化成非常量指针,并且仍然指向原来的对象;

常量引用被转换成非常量引用,并且仍然指向原来的对象;

常量对象被转换成非常量对象。

6.constexpr

constexpr是C++11中增加的关键字,他的意思是“常量表达式”,在编译期可求值的表达式。

(1)constexpr变量必须在编译的时候进行初始化。所有的constexpr变量均为常量,所以修饰的变量必须要是在编译期可求值的。

(2)与const 不同,constexpr申明中如果定义了一个指针,限定符constexpr仅仅对指针有效,与指针所指的对象无关。

const 和 constexpr的更多相关文章

  1. 【C++】C++中const与constexpr的比较

    先说结论相同点:const和consexpr都是用来定义常量的.不同点:const声明的常量,初始值引用的对象不一定是一个常量:constexpr声明的常量,初始值一定是常量表达式. constexp ...

  2. 3、const与constexpr

    初遇到constexpr真的是有点懵比,看了很多博客也没看懂,不知道是我太笨,还是别人写的太深奥?总之经过一番折腾算是入门了.一下是我个人总结,有不对的地方望指出. 一.学习const与constex ...

  3. C++总结:C++中的const和constexpr

    C++中的const可用于修饰变量.函数,且在不同的地方有着不同的含义,现总结如下. const的语义 C++中的const的目的是通过编译器来保证对象的常量性,强制编译器将所有可能违背const对象 ...

  4. C++中const与constexpr区别

    对于对象来说 const指的是编译期常量和运行时常量,两者并没有区分 constexpr特指编译期常量 对于函数来说 const可以修饰类的成员函数,被修饰的函数在执行期间不会改变对象的值. clas ...

  5. const与constexpr

    关于const型数据,谭浩强老爷子这么总结道: Time const t; //t是常对象,其值在任何情况下都不能改变 void Time::fun()const; //fun是Time类中的常成员函 ...

  6. C++ const和constexpr

    const expression , 常量表达式 , 在<C++ Primer>的定义:值不会改变并且在编译过程就能得到计算结果的表达式.   它要求两点:值不会改变,编译过程得到结果. ...

  7. C++常量表达式、const、constexpr(C++11新增)的区别

    常量表达式是指值不会改变且在编译过程中就能够得到计算结果的表达式,能在编译时求值的表达式. 程序先编译再运行:  在编译阶段, 编译器将在编译过程中把用到该常量的地方都全都替换为 常量的值. 但是常量 ...

  8. [c++] constexpr and literal class

    稀奇古怪的新特性,菜鸟在此啄上一啄. 1. When should literal classes be used in C++?   2. int i; // not constant const ...

  9. 概览C++之const

    1.C语言中const与 C++中的const void main() { const int a = 10; int *p = (int*)&a; *p = 20; printf(" ...

随机推荐

  1. UBUntu 软件 源配置方法

        近期公司产品须要添加一个功能,就是版本号自己主动更新.使用apt-get 实现. apt-get 软件源配置的方法,參见本人资源里的共享.以下是代码中作为升级的一部分.  FILE *fp; ...

  2. OpenStack源码系列---起始篇

    近一年来我负责公司云点的自动化部署工作,包括公司自有云平台方案.XenServer.vSphere.Ovirt和OpenStack的自动化安装部署,目前已经到了OpenStack这一部分.自动化部署首 ...

  3. ssh命令、ping命令、traceroute 命令所使用的协议

    在Node reboot or eviction: How to check if yourprivate interconnect CRS can transmit network heartbea ...

  4. openwrt: sysupgrade

    sysupgrade 用法: sysupgrade [...] sysupgrade [-q] [-i] 升级选项: -d 重启前等待 delay 秒 -f 从 .tar.gz (文件或链接) 中恢复 ...

  5. UVA 10887 Concatenation of Languages 字符串hash

    题目链接:传送门 题意: 给你两个集合A,B,任意组合成新的集合C(去重) 问你最后C集合大小 题解: 暴力 组成的新串hash起来 #include<bits/stdc++.h> usi ...

  6. javascript常用事件及方法

    1.获取鼠标坐标,考虑滚动条拖动 var e = event || window.event; var scrollX = document.documentElement.scrollLeft || ...

  7. dubbo简单配置与使用

    dubbo简介 随着互联网的发展,网站应用的规模不断扩大,常规的垂直应用架构已无法应对,分布式服务架构以及流动计算架构势在必行,亟需一个治理系统确保架构有条不紊的演进. 单一应用架构 当网站流量很小时 ...

  8. Spring中的事务管理(学习笔记)

    什么是事物? 事物是指逻辑上的一组操作,这组操作要么全部成功,要么全部失败. 事物的特性: 原子性.一致性.隔离性.持久性 Spring事务管理的高级接口: PlatformTransactionMa ...

  9. 二阶段 三阶段 提交 Paxos

    关于分布式事务.两阶段提交协议.三阶提交协议 - 文章 - 伯乐在线 http://blog.jobbole.com/95632/

  10. MySQL的简单优化

    一.如何发现需要优化的SQL 主要使用MySQL的慢查日志对有效率问题的SQL进行监控 第一步:启动慢查日志的监控 打开开关,将未使用索引的查询记录到慢查日志中 设置查询时间,当查询时间大于这个值,就 ...