C++11/14就学(一)nullptr与constexpr

一.nullptr

示例:

#include <iostream>

void foo(char * c){}
void foo(int n){}

int main()
{
    foo(0);
    // foo(NULL); // 编译无法通过
    foo(nullptr);
    return 0;
}

foo(NULL)无法编译通过,因为编译器不清楚NULL隐式转换为谁品种的参数来调用。
于是,当需要采取 NULL 时候,请养成直接利用 nullptr 的习惯。

二.constexpr

C++11新标准规定,允许以变量或函数声明也constexpr类型,由编译器来证明变量的值是否是一个常量表达式。
宣称也constexpr的变量一定是一个常量,而且得用常量表达式初始化

1.constexpr修饰函数

constexpr int sub(int i)
{
    return i – 1;
}

constexpr int a = 1;        // 1 是常量表达式
constexpr int b = a + 1;    // a + 1 是常量表达式
constexpr int sz = sub(b);    // sub是一个constexpr函数,这是一条正确的声明语句
int arr[sub(b)] = { 0 };    // 编译器允许这样的定义,并将sub(b)优化成1。C++11之前这是非法的

 

2.constexpr修饰类

constexpr可以修饰类的构造函数
就:保证传递给该构造函数的有着参数还是constexpr,那么有的靶子的兼具成员还是constexpr。
该目标也是constexpr对象了,可用以只行使constexpr的场地。
**注意**constexpr构造函数的函数体必须为空,所有成员变量的初始化都放初始化列表中。

class Test
{
public:
    constexpr Test(int arg1, int arg2) : v1(arg1), v2(arg2) {}
private:
    int v1;
    int v2;
};

constexpr Test A(1, 2)
enum e = { x = A.v1, y = A.v2 };

 

3.constexpr递归函数

constexpr int fibonacci(const int n)
{
    return n == 1 || n == 2 ? 1 : fibonacci(n – 1) + fibonacci(n – 2);
}

 

于 C++14 开始,constexptr
函数可以当里面以部分变量、循环和支行等简易语句
比如下面的代码在 C++11 的正统下是不能够透过编译的

constexpr int fibonacci(const int n)
{
    if (n == 1) return 1;
    if (n == 2) return 1;
    return fibonacci(n – 1) + fibonacci(n – 2);
}

 

4.使用constexpr的好处

  1. 死强的格,保证程序的不错定义不给毁损;
  2. 编译器对constexper代码进行了优化,例如:将运用的constexpr表达式直接调换成结果;
  3. 相比宏来说没有额外的付出。