mutable:mutable是为了突破const的限制设置的。被mutable修饰的变量,将永远处于可变的状态,即使在const函数里面。 经典应用场景:测试一个方法被调用的次数
volatile:在多线程下,当两个线程都要用到某个变量且该变量的值回被改变时,应该用volatile声明,该关键字的作用是防止优化编译器把变量从内存装入CPU寄存器中。如果内存被装入寄存器中,两个线程有可能一个使用内存中的变量,一个使用寄存器中的变量,就会造成程序错误执行。
1.12 谈谈原子操作原子操作就是不可被中断的一个或者一系列操作。实现方法:总线加锁或者缓存加锁。
1.13 谈谈右值引用Move Semantics(移动语义):移动语义避免了临时对象的拷贝,它不用重新分配一块新的空间同时将要拷贝的对象赋值过来,而是“拿”了过来,将自己的指针指向别人的资源,然后将别人的指针修改为nullptr。
Perfect Forwarding(完美转发):保持原来值(左值、右值)的属性不变。
1.14 谈谈浅拷贝和深拷贝浅拷贝:只复制指向某个对象的指针,不会复制对象本身,新旧对象共享同一块内存。
深拷贝:创造一个一模一样的对象,新对象与原对象不会共享内存,修改新对象时候旧对象不会发生改变。
1.15 析构函数函数必须是虚函数吗?构造函数呢?对于不存在继承关系的对象,其析构函数可以不是虚函数,但是如果存在继承关系,析构函数必须是虚函数,这样当父类指针指向子类对象时候,这样在删除父类指针的时候会通过虚函数表找到正确的派生类析构函数并且调用它,从而正确的析构整个子类对象。
构造函数不能为虚函数,声明虚函数就会有虚函数表,且函数调用通过虚函数完成。然而虚函数表是在对象构造的时候完成的,没有构造对象,都没有虚函数表,无法调用构造函数。
1.16 如何理解多态多态就是允许子类类型的指针赋值给父类类型指针,调用属于子类的函数,每一个类都会使用一张虚表,每个类对象都会使用一个虚指针,且c++编译器需要保证虚函数表的指针处在对象实例的最前面。存在的问题:可以通过虚函数表来访问类中non-public的虚函数。
1.17 谈谈虚函数工作机制c++实现虚函数的原理是虚函数表+虚表指针,当一个类中存在虚函数的时候,编译器就会为类创造一个虚函数表,虚函数表是一个数组,数组的元素存放的是类中的虚函数地址。同时为每个类的对象添加一个隐藏成员,该隐藏成员保存了指向该虚函数表的指针,该隐藏成员占据该对象的内存布局的最前端,所以虚函数表只有一份,而有多少个对象,就对应有多少个虚函数表指针。



