C++新特性

原创 2016年08月30日 12:29:58

1.nullptr  

特殊类型的字面值,可以转换成任意其他的指针类型。


2.auto类型说明符 

1)分析表达式的类型,赋给变量,编译阶段推算类型;

2)利用auto在一条语句中定义多个变量时,所有变量的初始数据类型必须一样;

3)auto 针对const 类型数据的推算有一定的区别,一般会忽略顶层的const(如果希望推算出来的类型是顶层const,则需明确指出const auto),保留底层的const(底层const 一般与指针,引用相关,所指向的变量是常量)。

4)auto与动态分配

auto p= new auto(obj);//auto p= new auto(2);括号内必须是单一对象

根据obj的类型推算p的类型,上例中p是int*型。

auto不能用于动态分配数组,因为在括号中不能给出对象。


3.范围for循环

1)for(变量:对象序列); 针对是序列,拥有能返回迭代器的begin和end成员。

for(auto &r : v)  r=*2;

等价于:

for(auto beg=v.begin(),end=v.end();beg!=end;++beg)

{

auto &r=*beg;

r*=2;

}

实际在范围for循环中预留了v.end()的值,所以不能用于增加或删除v中元素。


2)for(auto c: str) ; 如果想改变序列中的变量时,则需声明变量的引用。

3)for(auto &c: str) ; 每次迭代时,c会被初始化成str中的下一个元素。

4)范围for循环不能处理动态数组(new出来的数组,返回的是个指针,不能调用begin和end)中的元素。


4.lambda 表达式, 一般作为算法调用对象,可作为一种仿函数。

例:sort(words.begin(),words.end(),[](string&a, string&b){return a.size()>b.size();})

1)形式

[捕捉列表](参数列表)->返回类型{函数体}

可以省略参数列列表和返回类型,但捕捉列表和函数体不能省略。

auto f=[] {return 42;}; 可直接调用cout<<f()<<endl;  // 42

2)传递参数

不能使用默认参数,即调用时实参和形参的个数相同,类型匹配。

3)捕捉列表

[sz](const string& a){return a.size>=sz;};

只能捕捉表达式所在函数内的局部非static变量,而可以直接使用局部的static变量以及函数外声明的名字。

捕捉分为值捕捉和引用捕捉:

值捕捉:auto f=[v1] {return v1;};

被捕捉变量是在表达式定义时被拷贝,而非执行时。

引用捕捉:auto f=[&v1] {return v1;};

必须保证表达式执行时,变量是存在的。比如含有引用捕捉的表达式不能作为函数返回值。

隐式捕捉:利用编译器推断捕捉列表。[&] 默认引用捕捉;[=]默认值捕捉;

当隐式捕捉和显示捕捉混合使用时,捕捉列表中的第一元素必须是&或=,同时显示捕捉的变量的方式和隐式捕捉的方式必须不同;

[&,a,d]  或 [=,&a,&d]

4)可变lambda表达式,使用关键字mutable,主要针对值捕捉方式,用于修改捕捉到的变量

auto f=[v1] () mutlab {return ++v1;};

对于引用捕捉到的变量能否修改,取决于其指向的变量是否是const。

5)指定返回类型,必须使用尾置返回类型

[ ](int i)->int {if(i>0) return i;esle return -i;};

若函数体中只含有单一的return语句,表达式可自动推算;若含有除了return语句之外的其他语句,则只能推算成void型,无返回值。这时,就有必要指定返回类型。

6)参数绑定

一般捕捉列表为空的lambda表达式,可以函数方便替换;对于捕捉局部变量的表达式,则不同容易。这时需用bind函数进行参数绑定。

auto 新调用对象=bind(原调用对象,参数列表);

参数列表一般会使用到占位符_n。

auto checks=bind(check_size,_1,6);


补充: 

new operator 与operator new的区别

new operator :即我们常用的new。语言内置的,不能改变其的含义。它其实干了两件事:一、分配足够的内存(operator new 完成)(实际大小是大于所创建的对象大小)二、调用对象构造函数,new operator永远干这两件事。

operator new:起分配内存的作用(就像malloc一样),我们能够做的仅仅是重载operator new,一个典型的例子就是placement operator new。在指定的内存上分配空间。

operator new:

void * operator new(size_t) 
  { 

        void* location=malloc(size_t);

  return location; 
  } 

placement operator new:

void * operator new(size_t, void *location) 
  { 


  return location; 
  }

版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

A Morden C++ —— C++11新特性指南

A Morden C++ —— C++11新特性指南 by JOKER on 2013/10/14 不知不觉C++1x,也就是以前的C++0x已经基本达到工业使用的成熟度了,各个编译器的实...

C++ (新特性)PPt

  • 2012-06-21 20:32
  • 1019KB
  • 下载

C++ 新特性学习(三) — Regex库

C++ STL终于会放点实用的东西了。可喜可贺。 这个,显然是正则表达式库,作为一个强大而又NB的库,我表示对其理解甚少,只能先研究下基本用法,更具体的用法要等实际应用中用到的时候在细看了。 ...
  • hjpcb
  • hjpcb
  • 2013-07-17 20:35
  • 571

c++ 11 新特性

目录(?)[-] Lambda 表达式自动类型推导和 decltype统一的初始化语法deleted 函数和 defaulted 函数nullptr委托构造函数右值引用C11 的标准库 线程库新的...

C++14新特性

【原文】https://zh.wikipedia.org/wiki/C%2B%2B14 C++14[编辑] C++14是C++的现行标准的非正式名称,正式名称为"International...

从VC++6.0不足看Visual C++2010新特性

说起VC,有人想到维生素C(维C),有人想到风险投资(venture capital), 程序员们尤其是做底层开发的程序员或老程序员们第一感觉肯定会想到Visual C++6.0。为什么是6.0而不是...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)