C++ 11 新特性
类内成员赋初值
类内数据成员允许赋默认值。
C11以前是会报错的。ISO C++ forbids initialization of member `name_var_'
lambda表达式
lambda表达式本质上是一个未命名的内联函数。
很多语言都提供了 lambda 表达式,如 Python,Java 8。lambda 表达式可以方便地构造匿名函数,如果你的代码里面存在大量的小函数,而这些函数一般只被调用一次,那么不妨将他们重构成 lambda 表达式,简化编程。
lambda 格式:[capture list](parameter list)->return type {function body}
我们可以忽略参数列表和返回类型,但必须永远包含捕获列表和函数体。
regex
regex
random
C98中,通过rand()函数生成随机数。C 11使用 default_random_engine 类 和 相应的分布类。
智能指针
cpp中,动态内存的管理是通过new、delete这一对操作实现的。delete操作的时机很难正确的把握,所以c11引入了智能指针,smart pointer,本质是模板类。
shared_ptr允许多个指针指向同一个对象。
unique_ptr独占所指的对象。
最安全的分配和使用动态内存的方法是调用make_shared库函数,它负责在堆中申请动态对象并返回智能指针。
每个智能指针都自动的维护着一个引用计数,若减为0,则自动调用对象的析构函数释放内存,不需程序员进行delete操作。当指向一个对象的最后一个shared_ptr销毁时,该对象也会被销毁。
shared/unique _ptr二者都支持的操作 | |
shared_ptr<T> p或 unique_ptr<T> p | 空智能指针,可以指向类型为T的对象 |
p | 若p指向一个对象,p为true,可用于if(p)判断 |
*p | 解引用p,获得它指向的对象,类似普通指针 |
p->member_object | 等价于(*p).member_object |
p.get() | 返回p中保存的指针。要小心使用,若智能指针释放了对象,返回的指针所指的对象就也消失了 |
shared_ptr 独有的操作 | |
make_shared<T>(args) | 根据args参数创建T类型动态对象,然后返回shared_ptr 对象 |
shared_ptr<T> p(q) | p是q的拷贝;此操作会递增q中的计数器。初始化要求类型兼容。 |
p=q | p的引用计数减一,q的引用计数加一 |
p.use_count() | 返回与p共享对象的智能指针数量 |
p.unique() | 若p.use_count()为1,返回true,否则是false。 |
范围for
更简单的for语句,用于遍历序列或容器的元素,并执行特定操作。
语法为 for(declaration:expression) statement 即for(变量:序列) 语句
大括号赋值
c11允许使用大括号括起来的初始值列表给对象赋值。
vector<int> v;v={1,1,2};
这在c11以前是错误的。
委托构造函数
只是新特性,不涉及关键字。委托构造函数使用所在类的其他构造函数,来完成初始化过程。优点就是少敲键盘。
class A{ private: int a,b; public: A(int a,int b){this->a=a,this->b=b;} A(int x):A(x,2){} #ifdef c98 //error: type `class A' is not a direct base of `A' #endif };
string与数值类型 互转
数值类型转string
string to_string (int val);//long、float、unsigned int 等数据类型的重载也都有。
string转数值类型
int stoi (const string& str, size_t* idx = 0, int base = 10);
unsigned long long stoull (const string& str, size_t* idx = 0, int base = 10);
类似的,还有stod double、stof float、stoi int、stol long、。。。