C++ const和constexpr】的更多相关文章

先说结论相同点:const和consexpr都是用来定义常量的.不同点:const声明的常量,初始值引用的对象不一定是一个常量:constexpr声明的常量,初始值一定是常量表达式. constexpr是c++11标准添加的关键字. 之所以说const声明的常量,初始值不一定是一个常量,主要是从引用和指针的角度出发的.如果初始化const时候,指定一个固定的字面值常量,那么它引用的肯定是常量. ; constexpr ; 这种情况下,i和j都是常量,而且它们引用的也是一个常量(因为是固定的字面值…
初遇到constexpr真的是有点懵比,看了很多博客也没看懂,不知道是我太笨,还是别人写的太深奥?总之经过一番折腾算是入门了.一下是我个人总结,有不对的地方望指出. 一.学习const与constexpr必须要先知道一下几个概念: 1.constexpr是constant expression的缩写.顾名思义“常量 表达式” 2.何为常量表达式(constant expression):是指由编译器求值的表达式. 在这里在解释一下编译器求值概念:编译系统由预处理器.编译器.汇编器.连接器四部分组…
C++中的const可用于修饰变量.函数,且在不同的地方有着不同的含义,现总结如下. const的语义 C++中的const的目的是通过编译器来保证对象的常量性,强制编译器将所有可能违背const对象的常量性的操作都视为error. 对象的常量性可以分为两种:物理常量性(即每个bit都不可改变)和逻辑常量性(即对象的表现保持不变).C++中采用的是物理常量性,例如下面的例子: struct A { int *ptr; }; int k = 5, r = 6; const A a = {&k};…
在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){} 指针所指的…
对于对象来说 const指的是编译期常量和运行时常量,两者并没有区分 constexpr特指编译期常量 对于函数来说 const可以修饰类的成员函数,被修饰的函数在执行期间不会改变对象的值. class Person{ public : string getName() const; void setAge() const; private : string name; mutable int age; } // 可以执行 string Person::getName() const { ret…
关于const型数据,谭浩强老爷子这么总结道: Time const t; //t是常对象,其值在任何情况下都不能改变 void Time::fun()const; //fun是Time类中的常成员函数,可以引用,但不能修改本类中的数据成员 Time * const p; //p是指向Time类对象的常指针变量,p的指向不能改变 const Time * p; //p是指向Time类常对象的指针变量,p指向的类对象的值不能通过p来改变 const Time &t1 = t; //t1是Time类…
const expression , 常量表达式 , 在<C++ Primer>的定义:值不会改变并且在编译过程就能得到计算结果的表达式.   它要求两点:值不会改变,编译过程得到结果. 因此不是所有的const常量都是常量表达式. ; // YES ; //YES const int sz = get_size(); // NO ,函数必须运行后才能得到结果(不考虑constexpr函数) : 是常量,但是不是常量表达式 因此,我们引出constexpr关键字,来验证是否为一个const e…
常量表达式是指值不会改变且在编译过程中就能够得到计算结果的表达式,能在编译时求值的表达式. 程序先编译再运行:  在编译阶段, 编译器将在编译过程中把用到该常量的地方都全都替换为 常量的值. 但是常量不是常量表达式, 只有用常量表达式初始化的常量 才是成为常量表达式,用非常量表达式初始化的常量仅仅是常量..如果常量的初始值不是常量表达式,则该常量不是常量表达式. 一个变量可以用constexpr类型说明符声明成 constexpr类型,  则变量是一个常量, 且声明为constexpr的变量必须…
稀奇古怪的新特性,菜鸟在此啄上一啄. 1. When should literal classes be used in C++?   2. int i; // not constant const int size = i; // fine! 可以,但为什么不在这里就先判断出问题的隐患呢? int arr[size]; // Error! 然而对于constexpr,则表明这个值不仅是constant的,而且也是编译期确定的 int i; // not constant constexpr i…
1.C语言中const与 C++中的const void main() { const int a = 10; int *p = (int*)&a; *p = 20; printf("%d", a); } 比較上述代码在C中和C++中执行结果:C:打印20:C++:打印0. 由此可见,C语言中的const是个"冒牌货",C++中 的const是一个真正的常量. 原因:C语言直接为a分配了内存. C语言中的const变量是仅仅读变量,有自己的存储空间.而C++…
一.constexpr意义 将变量声明为constexpr类型以便由编译器来验证变量是否是一个常量表达式(不会改变,在编译过程中就能得到计算结果的表达式).是一种比const更强的约束,这样可以得到更好的效率和安全性. 二.constexpr用法 1.修饰函数 /*1.如果size在编译时能确定,那么返回值就可以是constexpr,编译通过*/ constexpr int getSizeA(int size) { *size; } /*2.编译通过,有告警:在constexpr中定义变量*/…
最近在重新看<<C++ Primer>>,第一遍的时候const和constexpr看得并不太懂,这次又有了些更新的理解,当然可能仍然有许多不对的地方... 首先,const限定符即“常量”,一旦使用了const,那么对象的值不能再改变,比如: const int i=1; 同时,const修饰的变量必须初始化,因为如果不初始化,那么就永远无法初始化了. 常量的初始化并不一定需要用常量,字面值或者是普通对象都是可以的,例如: int i=5; const int j=i; cons…
本系列文章由 @yhl_leo 出品,转载请注明出处. 文章链接: http://blog.csdn.net/yhl_leo/article/details/50864210 关键字 constexpr 于 C++11 中引入并于 C++14 中得到改善.它表示常数表达式.与 const 相同,它可应用于变量,因此如果任何代码试图修改该值,均将引发编译器错误.与 const 不同,constexpr 也可应用于函数和类构造函数. constexpr 指示值或返回值是常数,并且如果可能,将在编译时…
一. const 和constexpr的区别 (一)修饰变量时,const为“运行期常量”,即运行期数据是只读的.而constexpr为“编译期”常量,这是const无法保证的.两者都是对象和函数接口的组成部分. (二)修饰函数时,与const关键字相比,constexpr关键字不仅可以修饰变量和指针,还可以修饰函数(含构造函数).注意constexpr用于定义自定义类的对象时,要求该类具有常量构造函数,而使用const定义类对象时,则无此要求. (三)两者在修饰指针时,行为有所差异.const…
1.constexpr 1.const与constexpr: const: 承若不改变这个值,主要用于说明接口,这样在把变量传入函数时就不必担心变量会在函数内被改变了,编译器负责确认并执行const的承若. constexpr:在编译时求值,主要用来说明常量,作用是允许将数据置于只读内存中以及提升性能. 常量表达式指由编译器求值的表达式. //使用const定义常量 const int x = 7; // const string s = "hello"; // const int y…
Scott Meyers在effective modern c++中提到“If there were an award for the most confusing new word in C++11, constexpr would probably win it.” 由此可见,constexpr确实是比较难以让人理解.加之其在C++11和14中的标准略有不同,也加剧了这种难度. 参考几本经典教材(C++ primer, effective modern C++, a tour of C++)…
一.constexpr变量 1)将变量声明为constexpr类型以便由编译器来验证变量的值是否为一个常量表达式,声明为constexpr的变量一定是一个常量,而且必须用常量表达式来初始化,如: int a = 10; constexpr b = a + 10;//错误,需要将a声明为const int常量. 2)const与constexpr之间的区别 a)const所定义的变量,一经初始化便不能修改,但是不要求const所定义变量在编译的时候就能被算出. b)constexpr定义的变量要求…
constexpr 是什么? 关键字 constexpr (constant expression) 是在 C++11 中引入的,并且在 C++14 中进行了优化. constexpr 和 const 一样可以用来修饰变量:试图修改 constexpr 变量时,编译器将会报错. 不同于 const, constexpr 还可以修饰函数和类的构造函数. constexpr 表示值或者返回值是常量,并且如果可能,在编译时计算它们. 一个 constexpr 整型值能够用在任何 const 整型值可以…
1.新增算术类型     longlong,最小不比long小,一般为64位. 2.列表初始化      int units_sold = {0};或者 int units_sold{0};非11标准下的C++中,只有特定的情况下才能使用该形式.  比如数组的初始化,类构造函数的初始化,结构体的填充.相比传统的赋值初始化,如果右侧的数值类型相对于左侧类型更大的话,侧对于这种窄化现象,编译器会 报错.如:int k = {3.14};一个double是8个字节,int一般是4个字节,这时编译器就会…
1.变量之间的运算形式依赖于变量的数据类型,如i = i + j;当 i 和 j 是整型或者浮点型,则代表两个数的相加,如果是第一章所说的Sales_item类型,那么就是这两个变量的成分相加(如果书号相同则在卖出数量上相加). 2.使用Int执行整数运算.在实际应用中short常常显得太小而long一般和int有一样的尺寸.如果你的数值超过了Int表示的范围,选用long long. 3.执行浮点运算选用double,因为float通常精度不够而且双精度浮点数和单精度浮点数的计算代价相差无几.…
如果class内含const static integral data member,那么根据C++标志规格,我们可以在class之内直接给予初值.所谓integral泛指所有的整数型别(包括浮点数),不单只是指int,下面是一个例子: #include<iostream> using namespace std; template <typename T> class testClass { public: static const double _datai=1.2; stat…
v0.2 - Last updated November 8, 2013 源自 Google's C++ coding style rev. 3.274 目录 由 DocToc生成     头文件        #define用法        前向声明        内联函数        -inl.h文件        函数参数顺序        include的命名和顺序    作用域        命名空间            未命名空间            命名空间       …
C++14标准是 ISO/IEC 14882:2014 Information technology -- Programming languages -- C++ 的简称[1]  .在标准正式通过之前,原名C++1y. C++14标准的委员会草案N3690于2013年5月15日发表.[2]  2014年8月18日,经过C++标准委员投票,C++14标准获得一致通过.草案文档经过一定的文字润色和修正之后,将在年内提交给ISO作为正式的C++标准发布. 下面描述的特性是委员会草案N3690中所描述…
最近在看这个:LearnCpp 主要是一些我自己容易忽视的地方 记一些笔记在下面,还有错漏地方请不吝赐教 CH1.10 Preprocessing The preprocessor copies the contents of the included file into the including file at the point of the #include directive Conditional Compilation: #ifndef SOME_UNIQUE_NAME_HERE…
C++学习笔记--大杂烩                                                         by方阳 版权声明:本文为博主原创文章,转载请指明转载地址 http://www.cnblogs.com/fydeblog/p/7103529.html  摘要:这篇博客主要记录学习C++11的一些好方法,离写完还有很久,所以这篇博客会不定时更新,希望多多关注!博客最后有这个笔记的百度云链接! 1.  命名空间 使用命名空间,最好是分别引入,需要用哪个引用哪个…
前言:工作后吃饭的语言是java,同时写一些python和js,在学习机器学习的时候发现有必要再熟悉一下c++,同时工作也有c++的使用需求.于是开始对照c++ primer自学,希望能够对同样是其他语言的学习者,在学习c++的时候提供一些帮助. 第1章: 起始 First program 主流编译器:GNU 编译器和微软的编译器,运行微软编译器的命令是:cl Input/Output Using namespace used to avoid inadvertent collsions bet…
  一.问题定义与分析 问题定义 •要解决的问题——银行一天之内的: 1.总客户数 2.客户总逗留时间 3.客户平均逗留时间 问题分析 •新来的人找个短的队伍,站在队尾开始排队 •排在队头的人可以办理业务 •排队等待办业务的客户是在分散的.随机的时间点到来的 •特点:离散事件.要排队 •掌握每个客户到达银行和离开银行这两个时刻 •统计出客户总数 •称客户到达银行和客户离开银行这两个时刻发生的事情为“事件” •整个模拟按事件发生的先后顺序进行处理 •事件驱动模拟 •事件的主要信息是事件类型和事件发…
原文戳我 本文旨在为HHVM编写C++代码提供一种指南,包括了什么时候.怎么使用各种语言功能,以及代码的格式.我们的目标是确保代码持续高可用的同时,还能容易被阅读和参与贡献,尤其是对新人而言. HHVM代码库包含来自很多不同作者的大量代码.它已经经历了多个不同的重要阶段,包括存在于多个不同的仓库中.结果就是,有很大一部分代码(主要是老代码)不符合这个指南.所以在疑惑怎么写代码,或者怎么格式代码时,总是要优先考虑本文中的建议,而不要去参考已有代码的例子.如果你已经在工作中接触了一些老代码,请在过程…
变量和基本类型 不同平台下基本类型的字节数 类型 16位平台 32位平台 64位平台 char 1 1 1 short 2 2 2 int 2 4 4 long 4 4 8 long long / 8 8 指针 2 4 8 float 4 4 4 double 8 8 8 类型的最小尺寸 类型 含义 最小尺寸 bool 布尔类型 未定义 char 字符 8位 wchar_t 宽字符 16位 char16_t Unicode字符 16位 char32_t Unicode字符 32位 short 短…