#CPP
move函数的本质
move 只是把左值强制转换为右值引用,进而触发待移动对象的移动语义。如果待移动对象没有实现移动语义,就会走拷贝语义。可见 move 并不会窃取资源,实际要看待移动对象的自身情况
C++杂谈(一)
杂谈系列是对 C++ 语法的回顾与补充
左值、右值、亡值,纯右值,左值引用,右值引用
准确的来说,所有的引用,无论是左值引用还是右值引用,都是左值表达式。这是因为右值引用延长了右值的生命周期,我们可以去取右值引用的地址,因此它是个左值
C++中的多态
我选择放弃弄清楚带虚函数的菱形继承——虚拟继承方式(多继承),希望没机会碰到它
CAS机制
乐观锁却不这么想,但是资源只有一份,你乐观锁不加锁操作并不代表就可以直接访问资源而不管有没有人访问,所以乐观锁也有“加锁”机制,但是和悲观锁的行为不同。悲观锁是实际加锁和解锁来达到原子性,而乐观锁在正式更新数据之前会检查数据是否被其他线程改变过,如果未被其他线程改变过就将共享变量更新成最新值,如果发现共享变量已经被其他线程更新过了,就重试,直到成功为止。整个过程不涉及加锁和解锁操作,但却已实现原子性
谈一谈 RAII 技术
利用 C++ 局部对象离开作用域,自动调用析构函数的特点。RAII 让资源的生命周期和对象绑定,对象生命周期结束会带走资源。在构造函数中获取资源,要记得在析构函数中回收资源
移动构造函数和移动赋值函数
看来移动语义和复制语义的根本不同点就是,移动语义是浅拷贝(改变指向),复制语义是深拷贝(重新 new)
拷贝赋值函数
拷贝构造函数是用一个已经存在的对象初始化一个正在创建的对象,而赋值运算符函数是用一个已经存在的对象赋值另一个已经存在的对象,这是二者本质的区别
再谈单例
线程安全的单例和单例资源的回收,实现单例模板类支持快速创建单例
单继承和多继承
当创建一个类时,您不需要重新编写新的数据成员和成员函数,只需指定新建的类继承了一个已有的类的成员即可。这个已有的类称为基类,新建的类称为派生类