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; 
  }

C++ (新特性)PPt

  • 2012年06月21日 20:32
  • 1019KB
  • 下载

C++:C++11新特性详解(1)

前言:虽然目前没有编译器能够完全实现C++11,但这并不意味着我们不需要了解,学习它。深入学习C++11,你会发现这根本就是一门新的语言,它解决了c++98中许多遗留下来的问题。早晚会有一天,C++1...
  • linwh8
  • linwh8
  • 2016年06月05日 23:28
  • 4726

C++ 11 新特性之统一初始化语法

C++  之前的初始化语法很乱,有四种初始化方式,

Visual C++ 2010新特性:MFC的三大巨变

0购     【IT168 专稿】在Visual C++ 2010中,无论从用户体验,还是从性能方面,IDE都有着巨大的改进,这些改进大大地提高了程序员的开发效率。除此之外,增强的MFC,为程序员...

C++新特性(类与对象的各种指针和引用)

对象与函数的关系(知道如何把对象指针和引用作为函数参数)   将对象指针作为函数的参数,传递给函数处理有两个好处 1、减少数据分配的时间和空间,提高了程序运行的效率; 2、在被调函数中,可以直...

在Visual Studio11编译器的安全性增强-下一代Visual C++2012的新特性

(注 - 这个博客帖子描述了一个在未发布的产品的功能,此功能可能会改变最终产品发布之前。)微软正在积极开发的Visual Studio11,不断寻找方法,以提高安全相关的功能。作为这项工作的一部分,我...

C++ 11新特性在Cocos2dx 3.0应用

□文/传智播客C/C++高级讲师 童泽宇      个人简介:曾就职于知名杀毒软件公司,长期从事计算机病毒研究,参与反病毒引擎、病毒鉴定器开发,熟悉CPU虚拟化技术,专注于操作系统底层,精...

C++新特性之lambda表达式在for_each循环中的使用及for循环新写法

以前,在lambda表达式没有进入标准的时候,对容器的遍历等涉及到使用函数指针的情况,一般人会懒得使用std::for_each,也许只是一个短短的几句话,却要单独写个函数,或函数对象,写的代码反而不...
  • jack_20
  • jack_20
  • 2017年06月26日 16:43
  • 553

【陷阱代码】c++ 第二篇 c++11新特性及偏冷门语法场景 面对审查代码

很遗憾,原始代码未仔细整理,只留有分享给别人的截图,来源于学习c11时的构想 陷阱点: 1、lamda[i]传值是只读复制,不能改,++无效,要用i+1 2、如果加了mutabl...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:C++新特性
举报原因:
原因补充:

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