C++11新特性总结

类型说明符

  • auto用于从初始化表达式中推断出变量的数据类型。auto定义的变量必须有初始值。
auto a = 10;//typeid(a).name()==int
auto b ;// err
  • decltype用于选择并返回操作数的数据类型。编译时类型推导,以一个普通表达式为参数,返回该表达式类型,并不会对该表达式求值
int a = 1;
decltype(a) b;
decltype((a))b;//err
decltype((a)) b = a;

注意:

  • 如果decltype使用的是一个不加括号的变量,得到的就是该变量的类型。
  • 如果给变量加上了一层括号,编译器会把它当作一个表达式,得到的则是引用类型。

空指针nullptr

C++11 引入了 nullptr 关键字,专门用来区分空指针、0。

constexpr

  • constexpr变量

将变量声明为constexpr类型以便由编译器来验证变量的值是否为一个常量表达式,必须在编译期间计算出它的值并且它的值不可以被改变(VS2010目前不支持)

int a = 3;
int b = 4;
scanf("%d", &a);
constexpr int value1 = a + b;//编译器报错,表达式a + b不是常量表达式
const int value2 = a + b;//正常初始化,不会报错
  • constexpr函数

可以实现编译期函数:即函数在编译期执行完毕,并在调用处进行替换

规定:

  • 函数的返回值以及参数都必须为字面值类型;
  • 函数只能有一条return语句(C++14后无该要求);
  • 函数不一定返回常量表达式,但如果要初始化一个constexpr变量,则必须返回常量表达式(参数也必须为常量或常量表达式);
  • 函数被隐式的声明为内联函数;
  • 函数内部可以声明变量(声明之后是运行期还是编译期?),可以用using声明,空语句,类型别名,循环,判断语句等,但cout不行。

举例:

#include <iostream>
using namespace std;
//运算n的阶乘
constexpr int factorial(int n)
{
   
	return n == 0 ? 1 : n * factorial(n - 1);
}
int main()
{
   
	cout << factorial(10) << endl;
	system("pause");
	return 0;
}

noexcept

  • 在C++11中,声明一个函数不可以抛出任何异常使用关键字noexcept(VS2010目前不支持) 。

  • 编译器不会在编译时检查noexcept的说明,如果一个函数在说明了noexcept的同时又含有throw语句,编译器将顺利编译通过,并不会因为这种违反异常说明的情况而报错。


基于范围的 for 循环

简化了常见的循环,对数组或容器类等的每个元素执行相同的操作

for (auto x : xxx) {
   }

初始化列表

#include <initializer_list>

class Magic {
   
public:
    Magic(std::initializer_list<int> list) {
   }
};

Magic magic = {
   1,2,3,4,5};
std::vector<int> v = {
   1, 2, 3, 4};


模板增强

  • 类型别名:使用using关键字更加直观的定义别名
typedef int (*fun)(int *);   //以前c++的做法,声明一个参数为`int *`,返回值为int的函数指针,名字叫fun
using fun = int (*)(int *);  //c++11ÿ
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值