virtual
只有在子函数中的虚函数与父函数一模一样的时候(包括限定符)才会被认为是真正的虚函数
虚函数后面跟 const = 0;表示这个函数是纯虚函数,只有接口,由它的继承类具体定义它的行为,一个类里如果包含 =0 的纯虚函数,那么这个类就是一个抽象类,它不能具体实例化
final
c++ 11提供了防止继承发生的方法,及在类后面跟一个关键字finnal:
const final 也可指定函数,如果定义为final了, 则之后任何覆盖该函数的操作都将引起错误
override:
用来说明派生类中虚函数。
const
只有被声明为const的成员函数才能被一个const类对象调用。
const 修饰类成员函数,其目的是防止成员函数修改被调用对象的值
std::optional
对象只是包含对象的内部内存加上一个布尔标志。因此,大小通常比包含的对象大一个字节。
对于某些包含的类型,甚至可能根本没有大小开销,前提是附加信息可以放在包含的对象中。
没有分配堆内存。对象使用与所包含类型相同的对齐方式。
std::nullopt_t类型的nullopt是一种没有值的对象
std::move
std::move函数可以以非常简单的方式将左值引用转换为右值引用
std::move是将对象的状态或者所有权从一个对象转移到另一个对象,只是转移,没有内存的搬迁或者内存拷贝所以可以提高利用效率,改善性能.。
对指针类型的标准库对象并不需要这么做.
shared_ptr
以模板类的方式实现的。每个 shared_ptr 对象在内部指向两个内存位置:
1、指向对象的指针。
2、用于控制引用计数数据的指针。
工作原理:
1、当新的 shared_ptr 对象与指针关联时,则在其构造函数中,将与此指针关联的引用计数增加1。
2、当任何 shared_ptr 对象超出作用域时,则在其析构函数中,它将关联指针的引用计数减1。
如果引用计数变为0,则表示没有其他 shared_ptr 对象与此内存关联,在这种情况下,它使用delete函数删除该内存。
创建 shared_ptr 对象
std::shared_ptr
检查 shared_ptr 对象的引用计数
p1.use_count();
创建空的 shared_ptr 对象
std::shared_ptr
std::make_shared 一次性为int对象和用于引用计数的数据都分配了内存,而new操作符只是为int分配了内存。
分离关联的原始指针
p1.reset();
p1.reset(new int(34));在这种情况下,它将在内部指向新指针,因此其引用计数将再次变为1。
使用nullptr重置:
p1 = nullptr;
数组,自定义删除器
std::shared_ptr
// Lambda表达式作为删除器
std::shared_ptr
delete[] x;
});
shared_ptr 相对于普通指针的优缺点:
缺少 ++, – – 和 [] 运算符
不要使用同一个原始指针构造 shared_ptr
int *num = new int(23);
std::shared_ptr
std::shared_ptr
std::shared_ptr
不要用栈中的指针构造 shared_ptr 对象
int x = 12;
std::shared_ptr
std::shared_ptr
weak_ptr
解决shared_ptr循环引用的问题
weak_ptr虽然是一个模板类,但是不能用来直接定义指向原始指针的对象。
weak_ptr接受shared_ptr类型的变量赋值,但是反过来是行不通的,需要使用lock函数。
weak_ptr设计之初就是为了服务于shared_ptr的,所以不增加引用计数就是它的核心功能。
由于不知道什么之后weak_ptr所指向的对象就会被析构掉,所以使用之前请先使用expired函数检测一下
unique_ptr
独享所有权
unique_ptr对象始终是关联的原始指针的唯一所有者。我们无法复制unique_ptr对象,它只能移动。
由于每个unique_ptr对象都是原始指针的唯一所有者,因此在其析构函数中它直接删除关联的指针,不需要任何参考计数。