C++第11版本中的一些强大的新特性小结

2020-01-06 14:09:13王振洲

一个值:[x]
一个引用 [&x]
当前范围内任意变量的引用 [&]
同3,但是通过变量的值
你可以对上面的各项进行任意混合,只要用逗号隔开即可 [x, &y]

Argument List 参数列表

参数列表和 C++ 函数的参数列表是一个概念。

Function Body 函数体

函数体是指在 Lambda 表达式被调用时真正执行的代码。

Return Type Deduction

返回值推断

如果 Lambda 表达式只有一个返回声明,那么返回值类型就可以省略,其类型就是隐式类型:decltype(return_statement)

可变 Labmda

如果一个 Lambda 表达式被标记为 mutable(例如:[]() mutable{ }),那么对于按值捕获的数值来说,在函数体内就允许对这些值进行修改操作。

下面举个例子:


int main()
{
  char s[]="Hello World!";
  int Uppercase = 0; 
//lambda会改变这个变量的值
  for_each(s, s+sizeof(s), [&Uppercase] (char c) {
  if (isupper(c))
   Uppercase++;
  });
 cout<< Uppercase<<" uppercase letters in: "<< s<<endl;
}

Unique 指针

Unique 指针是 C++11 版本的智能指针类。

一旦你用 unique_ptr 关键字定义了一个对象,那么下列事件只要发生一个,对象就会被销毁并释放内存:

unique_ptr 管理的对象被销毁。
unique_ptr 管理的对象通过赋值操作符指向另一个指针,或调用了reset()方法。
对于不想了解太多细节的用户来说,这就意味着如果你使用了 unique 指针的语义,那么在跳出作用域之前,你就不用手动回收对象的内存了。

以前,我们需要这么写代码:


YourObject * obj = new YourObject();

然后在程序的最后你一定要记得释放内存:

delete(obj);
否则你可就造成内存泄露了。而现在,


std::unique_ptr<YourObject> obj(new YourObject());

当 obj 跳出作用域范围之外的时候,内存将会被自动回收。