C++11后的默认函数
c++新增俩默认构造: 移动构造&移动赋值
C++11后的8个默认成员函数(实际常用只有六个)
手动实现构造,还会自动生成析构吗?
会的
编译器自动生成 移动构造/移动赋值函数 的条件
移动构造, 移动赋值,析构, 拷贝构造, 拷贝赋值
三五法则
如果手动定义了五法则中的任意一个函数, 编译器则不会自动生成其他四个默认函数
如:如果我显示定义了析构, 编译器就不会自动生成拷贝构造函数等
三五法则/零法则 详情见:CSDN
Default & delete 强制/阻止生成默认函数
强制编译器生成默认函数
default 换为 delete 可阻止默认生成
模板可变参数
参数包代表多个参数类型多个参数(0-无穷个)
模板参数包
函数形参参数包
sizeof求包大小 要加 ...
如: sizeof...(args)
直接得出args个数, 而非空间大小
传递整个参数包 args...
Args 的 遍历
递归遍历
void Print()
{
cout << endl;
}
template <class T, class ...Args>
void Print(T&& x, Args&&... args)
{
cout << x << " ";
Print(args...);
}
另一种遍历
注意...与{}与逗号表达式作用
这里...表示一种模式, 类似于for in
push_back & emplace_back 对比
定义:
对比:
两者每次只能添加一个节点
但后者可以传参数包,前者不可
emplace不会解析args,只是搬运
模拟emplace_back传递args过程
template <class... Args>
void emplace_back(Args&&... args)
{
insert(end(), std::forward<Args>(args)...);
}
iterator insert(iterator pos, Args&&... args)
{
Node* cur = pos._node;
Node* newnode = new Node(std::forward<Args>(args)...);
Node* prev = cur->_prev;
// prev newnode cur
prev->_next = newnode;
newnode->_prev = prev;
newnode->_next = cur;
cur->_prev = newnode;
return iterator(newnode);
}
上课课件