9、pod
c++11中,学习pod的概念是非常有用的。
plain old data。
plain表示了pod是一个普通的类型。
old体现了他与c的兼容性。
在pod中,有两个基本概念:平凡的+标准布局的。
10、内联命名空间
c++中,名字空间的目的是分割全局共享的名字空间。
在c++11中,引入了“内联命名空间” inline namespace 就可以声明一个内联命名空间。
在内联空间中,允许程序员在父命名空间定义或者特化名字空间的模板。
当你需要长期维护,发布不同的版本的时候,可以用一下内联名字空间。 后续还会介绍。
11、nullptr
先来看一下NULL宏的定义:
#undef NULL #if defined(_cplusplus) #define NULL 0 #else #define NULL ((void*)0) #endif从代码中可以看到NULL可以是0或者是((void*)0),无论哪种都会出现这样那样的麻烦,所以在c++11中就出现了nullptr这个强类型。
void f(int); //#1 void f(char *);//#2 //C++03 f(0); //二义性 //C++11 f(nullptr) //无二义性,调用f(char*)在c++11用,我们要用nullptr来初始化指针。
12、override,final
final关键字的作用是使派生类不可覆盖它所修饰的虚函数。
override关键字的作用是保证编译器辅助检查。
13、lambda
他来源于函数式编程,也就是你在使用的地方定义,也就是“闭包”。
来看一下C++11中lambda的定义:
[capture](parameters) mutable->return-type {statement} [capture]:捕捉列表。
(parameters):参数列表。
mutable:mutable修饰符。
->return-type:返回类型。
{statement}:函数体。
看一下实例:
int main()
{
char s[]="Hello World!";
int Uppercase = 0; //modified by the lambda
for_each(s, s+sizeof(s), [&Uppercase] (char c) {
if (isupper(c))
Uppercase++;
});
cout << Uppercase << " uppercase letters in: " << s <
c++11中,引入lambda有两个原因:
1)、可以定义匿名函数。
2)、编译器会把其转换成函数对象。
14、static_assert
c++中assert宏只有在程序运行时才能起作用,#error只有在编译器预处理时才能起作用。
在c++11中加入了static_assert宏来实现编译时期的断言:静态断言。
他的声明方式:
static_assert(编译时可推断出结果的表达式,一个简单的多字节的字符串)。
第一个参数:断言表达式,必须是编译时可知的。
第二个参数:警告信息。
比如:
static_assert(sizeof(int) == 4, " 32-bit");
c++11中还有很多新变化,非常好用,c++11是一门新语言。
后续博客会进行详细解释。
——2013.12.19