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 :即我们常用的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;
}