C++11 中值得关注的几大变化(详解) | | 酷 壳 - CoolShell
1. delete 和 default
【C/C++】C++11新特性:=default 和 =delete - CSDN博客
1.1 delete 可以禁止某种方法或函数。
可以禁止拷贝构造函数生成。赋值构造函数生成。
1.2禁止函数某种类型的形参。
1.3 可以通过禁止new 操作符对象只存放在栈内存。
default 可以显示地生成默认函数。
引入的原因: 虽然用private 可以禁止调用拷贝构造函数,但一旦声明了拷贝构造函数, 默认构造函数就不会生成,如果你需要默认构造函数,就必须显示定义一个。即使这个默认构造函数什么都不做。
2. auto
auto 使代码更简洁,编译器可以根据初始化类型推导出变量类型。
一般用在STL 中, 如STL 的迭代器中。
3. nullptr
null 这个宏存在很多bug, 有的编译器会把他定义成0, 有的会把他定义成(void*) 0. 所以有时会存在二义性。
在重载函数中:
void fun(int );
void fun(char *)
fun(0) 会调用 哪个??
在C++11 新特性, fun(nullptr) 会调用 fun(char *),
所以在C++11 中请以nullptr 初始化指针。
4. 移动语义
移动语义的引入是为了解决在进行大数据复制的时候,将动态申请的内存空间的所有权直接转让出去,不用进行大量的数据移动,既节省空间又提高效率。
浅拷贝: 单纯的地址值拷贝, 不会重新分配内存。不同对象的指针会指向相同的地址空间,就会引发重复释放的问题。
深度拷贝: 会重新分配内存。但是对于生存周期马上结束的将亡值, 临时值, 深度拷贝会减慢效率。
考虑到浅拷贝和深度拷贝的缺点, 所以引入了移动语义,通过的 move 语句把内存的所有权转移。1. 函数返回值是右值。 2. move 语句显示转化为右值。 会触发移动语义。
5. lambda
引入 lambda 的意义有2个方面:1. 代码简洁, 用在STL 语句中, 如 for_each. 编译器会默认把lambda 转化为 函数对象。 2. lambda 函数限制了私有性,只在该函数体内被使用。
网友评论