[C/C++学习]之十七、C++11中我们需要关注的(二)

2014-11-24 07:11:01 · 作者: · 浏览: 1
string (string&&); //move constructor string&& operator=(string&&); //move assignment operator };

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