1、新增基于范围的for循环
int buff[5] = {1,2,3,4,5};
for(int &x : buff)
{
x +=1; //数组中每个元素倍乘
}
2、自动类型推断 auto
它的作用就是当编译器在一个变量声明的时候,能够根据变量赋的值推断该变量的数据类型。这样就有些逼近Python中定义变量的功能,无需提前声明定义的变量的数据类型。例如:
auto i = 1; //编译器自动推断i为int类型
3、匿名函数 Lambda
看https://blog.youkuaiyun.com/qq_41399894/article/details/100653786
4、空指针常量 nullptr
NULL通常在C语言中预处理宏定义为(void*)0或者0,这样0就有int型常量和空指针的双重身份。但是C++03中只允许0宏定义为空指针常量,这就会造成如下的错误:
void test(int i){cout << "hello NULL";}
void test(int * i){cout << "hello nullptr";}
上面声明了两个重载函数,当我调用foo(NULL),编译器将会调用test(int)函数,而实际上我是想调用test(int*)函数的。为了避免这个歧义,C++11重新定义了一个新关键字nullptr,充当单独空指针常量。
5、long long int类型
C++03中,最大的整数类型是long int。它保证使用的位数至少与int一样。 这导致long int在一些实现是64位的,而在另一些实现上却是32位的。C++11增加了一个新的整数类型long long int来弥补这个缺陷。它保证至少与long int一样大,并且不少于64位。这个类型早在C99就引入到了标准C中, 而且大多数C++编译器都以扩展的形式支持这种类型了。
6、允许sizeof运算符可以再类型数据成员上使用,无需明确对象。
struct p {myClass member;};
sizeof(p::member);
7、线程支持
C++11虽然从语言上提供了支持线程的内存模型,但主要的支持还是来自标准库。
新的标准库提供了一个线程类(std::thread)来运行一个新线程,它带有一个函数对象参数和一系列可选的传递给函数对象的参数。通过std::thread::join()支持的线程连接操作可以让一个线程直到另一个线程执行完毕才停止。std:thread::native_handle()成员函数提供了对底层本地线程对象的可能且合理的平台相关的操作。
为支持线程同步,标准库增加了互斥体(std::mutex, std::recursive_mutex等)和条件变量(std::condition_variable 和std::condition_variable_any)。这些都是通过RAII锁和加锁算法就可以简单使用的。
有时为了高性能或底层工作,要求线程间的通信没有开销巨大的互斥锁。原子操作可以达到这个目的,这可以随意地为一个操作指定最小的内存可见度。显式的内存屏障也可以用于这个目的。
C++11线程库还包含了futures和promises,用于在线程间传递异步结果。并且提供了std::packaged_task来封装可以产生这种异步结果的函数调用。
更高级的线程支持,如线程池,已经决定留待在未来的 Technical Report 加入此类支持。更高级的线程支持不会是 C++11 的一部份,但是其最终实现将建立在目前已有的线程支持之上。std::async 提供了一个简便方法来运行线程,并将线程绑定在 std::future上。用户可以选择一个工作是要在多个线程上异步的运行,还是在一个线程上运行并等待其所需要的数据。默认的情况,实现可以根据底层硬件选择前面两个选项的其中之一。另外在较简单的使用场景下,实现也可以利用线程池提供支持。
8、虚函数的override和final指示符
•override,表示函数应当重写基类中的虚函数。
•final,表示派生类不应当重写这个虚函数=。
9、后置返回类型(tailng-return-type)
template Ret adding_func(const Lhs &lhs, const Rhs &rhs) {return lhs + rhs;}
这不是合法的C++,因为lhs和rhs还没定义;解析器解析完函数原型的剩余部分之前,它们还不是有效的标识符。
为此, C++11引入了一种新的函数声明语法,叫做后置返回类型(trailing-return-type)。