关闭

C++新特性

60人阅读 评论(0) 收藏 举报

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

0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:7147次
    • 积分:567
    • 等级:
    • 排名:千里之外
    • 原创:53篇
    • 转载:1篇
    • 译文:0篇
    • 评论:2条
    文章分类
    最新评论