1、nullptr
使用指针时,务必需要将其初始化,否则将会是一个悬挂指针;
【NULL】:传统的C中NULL被定义为字面量0或者定义为无类型指针(void*);
【nullptr】:C++11中,nullptr是一个指针空值类型的常量,指针空类型为nullptr_t,而不是指针;
==> typedef decltype(nullptr) nullptr_t;
- 当在模板推导时,不会被推导为指针类型;
- 不是一个(void*)0的别名;
- 是一个编译期常量;
- 能够隐式转化到其他指针类型;
- 其地址不能被用户获取(为右值常量);
【nullptr_t】:声明一个指针空值类型的变量;
- 使用该类型定义的数据都是等价的;
- 该类型可以隐式转换为任意指针,但不能转换为非指针类型;
- 不适合算术运算表达式,但满足关系表达式;
- 其地址能够被用户使用;
2、默认函数的控制
类的默认函数:
成员函数 == > 构造、拷贝构造、拷贝赋值、移动构造、移动拷贝、析构;
操作符函数 == > , & && * -* ->* new delete
【default】:C++11提供该关键字显示指定为默认版本;
【deleted】:C++11提供该关键字显示指定为删除该函数;
- 此类函数能够用于类外的成员函数上;
- 也可以使用类上;
- deleted可以删除一些转换函数,防止隐式转换;如:operator(char c) = deleted;
- 也可以使用在普通函数上;
3、lambda函数
lambda:该函数是基于初始状态进行运算(闭包的类);
表达式为:[]()mutable -> return-type { ...}
- []:捕捉列表;
- [var]:以值传递,若加上`&`则表示引用传递,使用当一个`=`或`&`表示父作用域的变量都可使用;
- this:以值传递一个this指针;
- 传入多个使用`,`分割;
- 捕捉列表不允许变量重复传递,当可以通过不同方式传递相同变量;
-
- ():参数列表,若无参数,则可以省略;
- mutable:默认为const,使用该修饰符可以取消常量性,当使用该修饰符,则()不能省略;
- ->return-type:返回类型;
- {}:函数体;
3.1 lambda与仿函数
C++【STL】 | 仿函数的应用以及如何规范要求
可以使用lambda替代仿函数;
class AirportPrice {
private:
float _dutyfreerate;
public:
AirportPrice(float rate) : _dutyfreerate(rate) {}
float operator(float price) {
return price * (1-_dutyfreerate/100);
}
};
void test() {
float tax_rate = 5.5f;
AirportPrice Changi(tax_rate);
auto Changi2 = [tax_rate](float price)->float{return price * (1-tax-rate/100);};
float purchased = Changi(3699);
float purchased = Changi2(2899);
}
3.2 lambad的参数问题
【值传递】:传递的值在`函数定义`时的值;
【引用传递】:传递的值是`函数调用`时(运行时)的值;
void test() {
int j = 12;
auto by_val = [=] { return j+1; };
auto by_ref = [&]{return j+1;};
cout << "by_val " << by_val() << endl;
cout << "by_ref " << by_ref() << endl;
j++;
cout << "by_val " << by_val() << endl;
cout << "by_ref " << by_ref() << endl;
}
C++11允许lambda向函数指针的转换;
- 该函数不能捕捉任何变量;
- 该函数类型需要一致;
- 参数必须一致;
mutable和const
【值传递】:const下,不能修改常量,mutable下可以,但修改不了外部变量;
【引用传递】:const下能修改但该不了外部变量,mutable可以将该外部变量修改;
void test() {
int j = 12;
auto by_val = [=] { return j+1; };
auto by_ref = [&]{ j = 10; return j;};
cout << "by_val " << by_val() << endl;
cout << j << endl;
cout << "by_ref " << by_ref() << endl;
cout << j << endl;
auto by_val_1 = [=]()mutable { j = 1; return j; };
auto by_ref_1 = [&] ()mutable { j = 2; return j; };
cout << "by_val " << by_val_1() << endl;
cout << j << endl;
cout << "by_ref " << by_ref_1() << endl;
cout << j << endl;
}
3.3 lambda与STL
可以将lambda应用于STL函数,提高代码的可读性,正确性,可维护性且其性能与内联函数不存在大的差别;
如:
find_if(begin(), end(), compose2(logical_and<bool>(),
bind2nd(less<int>(), high),
bind2nd(greater_equal<int>(), low)));
find_if(begin(), end(), [=](int i){
return i >= low && i < high;
});
|