const 和 constexpr
在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的更多相关文章
- 【C++】C++中const与constexpr的比较
先说结论相同点:const和consexpr都是用来定义常量的.不同点:const声明的常量,初始值引用的对象不一定是一个常量:constexpr声明的常量,初始值一定是常量表达式. constexp ...
- 3、const与constexpr
初遇到constexpr真的是有点懵比,看了很多博客也没看懂,不知道是我太笨,还是别人写的太深奥?总之经过一番折腾算是入门了.一下是我个人总结,有不对的地方望指出. 一.学习const与constex ...
- C++总结:C++中的const和constexpr
C++中的const可用于修饰变量.函数,且在不同的地方有着不同的含义,现总结如下. const的语义 C++中的const的目的是通过编译器来保证对象的常量性,强制编译器将所有可能违背const对象 ...
- C++中const与constexpr区别
对于对象来说 const指的是编译期常量和运行时常量,两者并没有区分 constexpr特指编译期常量 对于函数来说 const可以修饰类的成员函数,被修饰的函数在执行期间不会改变对象的值. clas ...
- const与constexpr
关于const型数据,谭浩强老爷子这么总结道: Time const t; //t是常对象,其值在任何情况下都不能改变 void Time::fun()const; //fun是Time类中的常成员函 ...
- C++ const和constexpr
const expression , 常量表达式 , 在<C++ Primer>的定义:值不会改变并且在编译过程就能得到计算结果的表达式. 它要求两点:值不会改变,编译过程得到结果. ...
- C++常量表达式、const、constexpr(C++11新增)的区别
常量表达式是指值不会改变且在编译过程中就能够得到计算结果的表达式,能在编译时求值的表达式. 程序先编译再运行: 在编译阶段, 编译器将在编译过程中把用到该常量的地方都全都替换为 常量的值. 但是常量 ...
- [c++] constexpr and literal class
稀奇古怪的新特性,菜鸟在此啄上一啄. 1. When should literal classes be used in C++? 2. int i; // not constant const ...
- 概览C++之const
1.C语言中const与 C++中的const void main() { const int a = 10; int *p = (int*)&a; *p = 20; printf(" ...
随机推荐
- 系统去掉 Android 4.4.2 的StatusBar和NavigationBar
1. System Bar简单介绍 在Android4.0 (API Level 14)及更高版本号中.System Bar由Status Bar<位于顶部>和Navigation Bar ...
- Vue 建立工程
npm install -g vue npm install -g vue-cli vue init webpack my-project cd my-project npm isntall npm ...
- iOS之UI--涂鸦画板实例
iOS之UI--涂鸦画板实例 首先是搭建框架 其他的略过,直接展示效果: 然后接下来上传搭建好两个控制器框架的源码百度云下载链接: http://pan.baidu.com/s/1skjpDox ...
- 1449: [JSOI2009]球队收益
1449: [JSOI2009]球队收益 Time Limit: 5 Sec Memory Limit: 64 MBSubmit: 757 Solved: 437[Submit][Status][ ...
- Fibonacci数列(找规律)
题目描述 Fibonacci数列是这样定义的:F[0] = 0F[1] = 1for each i ≥ 2: F[i] = F[i-1] + F[i-2]因此,Fibonacci数列就形如:0, 1, ...
- UVA11613 Acme Corporation —— 最小费用流(流量不固定的最小费用流)
题目链接:https://vjudge.net/problem/UVA-11613 题意: 商品X在第i个月内:生产一件需要花费mi元,最多可生产ni件,销售一件(在这个月内销售,而不管它是在那个月生 ...
- HDU3667 Transportation —— 最小费用流(费用与流量平方成正比)
题目链接:https://vjudge.net/problem/HDU-3667 Transportation Time Limit: 2000/1000 MS (Java/Others) Me ...
- LR问题汇总
关于录制打开IE问题 1.LR11用IE11录制脚本时能打开web页面,但是一直是0事件,也没有脚本代码; 解决方法: LR版本和IE版本兼容性问题,这个问题是我们安装环境时不注意,导致LR无法录制. ...
- poj 2771 Guardian of Decency 解题报告
题目链接:http://poj.org/problem?id=2771 题目意思:有一个保守的老师要带他的学生来一次短途旅行,但是他又害怕有些人会变成情侣关系,于是就想出了一个方法: 1.身高差距 ...
- poj 1274 The Perfect Stall 解题报告
题目链接:http://poj.org/problem?id=1274 题目意思:有 n 头牛,m个stall,每头牛有它钟爱的一些stall,也就是几头牛有可能会钟爱同一个stall,问牛与 sta ...