C++新特性 11

C++11 的新特性

1 变量和基本类型

1.1 long long 类型

扩展精度浮点数,10位有效数字

1.2 列表初始化

初始化的几种不同形式,其中用花括号来初始化变量称为列表初始化;

比如:


int i = 0;
int i = {0};
int i{0};
int i(0);

需要注意的是,当用于内置类型的变量时,这种初始化形式有一个重要的特点:如果我们使用初始化且初始值存在丢失信息的风险,则编译器报错;

例如:

long double ld = 3.1414141414;
int a{ld}, b = {ld}; //报错
int c(ld), d = ld; //正确

cout << "a:" << a << "b:" << b << "c:" << c << "d" << d << endl;

运行的时候,a,b则会提示报错信息:error: type 'long double' cannot be narrowed to 'int' in initializer list [-Wc++11-narrowing],这是因为使用long double的值初始化int变量时可能会丢失数据,所以拒绝a和b的初始化请求;虽然c,d虽然没有报错,但是确实丢失了数据;

[这是为什么?]

1.3 nullptr 常量

有几种生成空指针的方法:

int *p1 = nullptr; // 等价于int *p1 = 0;
int *p2 = 0;
int *p3 = NULL; // 等价于int *p3 = 0;

在新标准下,建议尽量使用新标准nullptr,nullptr是一种特殊类型的字面值,它可以被转换成任意其它的指针类型,虽然其它的方式也是可以的;

1.4 constexpr 变量

将变量声明为constexpr类型以便由编译器来验证变量的值是否是一个常量表达式;

声明为constexpr的变量一定是一个常量,而且必须用常量表达式来初始化,比如说下面的情况则是不正确的:

int t = 10;
constexpr int q = t + 20;
cout << "q" << q << endl;

需要将t声明为 const 才是正确的;

一般来说,如果你认定变量是一个常量表达式,那就把它声明为constexpr类型;

1.5 类型别名声明

使用类型别名可以使复杂的类型名字变得更简单明了,易于理解和使用;

现在有两种方法可以用来定义类型别名,一种是 typedef ,另一种则是新标准中的 using

原文地址:https://www.cnblogs.com/dwx-bzdcxy/p/14733377.html