C++ 11标准中,const 用于为修饰的变量添加“只读”属性而 constexpr关键字则用于指明其后是一个常量,编译器在编译程序时可以顺带将其结果计算出来,而无需等到程序运行阶段,这样的优化极大地提高了程序的执行效率,本文重点介绍C++ const与constexpr区别介绍,一起看看吧。 1. constexpr:常量表达式 所谓常量表达式,指的就是由多个(
constexprintfun(intx) {return1+2+x; } 3. constexpr修饰类的构造函数 constexpr还可以用来修饰类的构造函数,这样做的目的是为了得到一个常量对象。 constexpr修饰的构造函数称为常量构造函数,常量构造函数有一个要求 => 构造函数的函数体必须为空,并且必须采用初始化列表的方式为各个成员赋值 #include <iostrea...
constexpr还可以用于修饰自定义类型,不过有一个前提条件,就是该自定义类型具有constexpr修饰的构造函数,并且该构造函数不能有具体实现,否则会编译报错 class Student { public: constexpr Student(const char* name, int age) : name_(name), age_(age) {} void print() const { cout << name_ << ' ' ...
小结:const和constexpr在编译时计算能力上的区别在于const仅指示变量的值在运行时不可修改,而constexpr...
总的来说在 C++ 11 标准中,const 用于为修饰的变量添加“只读”属性;而 constexpr 关键字则用于指明其后是一个常量(或者常量表达式),编译器在编译程序时可以顺带将其结果计算出来,而无需等到程序运行阶段,这样的优化极大地提高了程序的执行效率。
intN>constexprintlength(constT(&)[N]){returnN; }// Recursive constexpr functionconstexprintfac(intn){returnn ==1?1: n * fac(n -1); }// User-defined typeclassFoo{public:constexprexplicitFoo(inti): _i(i){}constexprintGetValue()const{return_i; }private:int_i; };intmain(){/...
intN>constexprintlength(constT(&)[N]){returnN; }// Recursive constexpr functionconstexprintfac(intn){returnn ==1?1: n * fac(n -1); }// User-defined typeclassFoo{public:constexprexplicitFoo(inti): _i(i){}constexprintGetValue()const{return_i; }private:int_i; };intmain(){/...
struct S { constexpr S(int);};const S s0(0);constexpr S s1(1);s0是一个常量,但它不承诺在编译时初始化。s1是标记的constexpr,所以它是一个常量,因为它S的构造函数也被标记constexpr,它将在编译时初始化。大多数情况下,这很重要,因为在运行时初始化会非常耗时,并且您希望将该工作...
constexpr变量 一般来说,在日益复杂的系统中确定变量的初始值到底是不是常量表达式并不是一件容易的事。为了解决这个问题C 11允许将变量声明为constexpr类型以便由编译器验证变量的值是否是一个常量表达式。变量声明为constexpr类型,就意味着一方面变量本身是常量,也意味着它必须用常量表达式来初始化。constexpr int...
constexpr修饰的函数,简单的来说,如果其传入的参数可以在编译时期计算出来,那么这个函数就会产生编译时期的值。但是,传入的参数如果不能在编译时期计算出来,那么constexpr修饰的函数就和普通函数一样了。不过,我们不必因此而写两个版本,所以如果函数体适用于constexpr函数的条件,可以尽量加上constexpr...