c++11
unique_ptr
防拷贝
shared_ptr / weak_ptr:
引用计数,支持拷贝
面试
手写shared_ptr
各种ptr的特性对比, 不会问定制删除器和weak_ptr,但是问shared_ptr时,可以往这边延展.
工厂模式,观察者模式
PDF课件代码:
#include <iostream>
#include <mutex>
#include <thread>
using namespace std;
class Singleton
{
public:
static Singleton* GetInstance() {
if (nullptr == m_pInstance) {
m_mtx.lock();
if (nullptr == m_pInstance) {
m_pInstance = new Singleton();
}
m_mtx.unlock();
}
return m_pInstance;
}
// 内嵌垃圾回收类
class CGarbo {
public:
~CGarbo() {
if (Singleton::m_pInstance)
delete Singleton::m_pInstance;
}
};
// 静态成员变量,程序结束时,系统会自动调用它的析构函数从而释放单例对象
static CGarbo Garbo;
private:
Singleton() {};
// 防拷贝
Singleton(Singleton const&);
Singleton& operator=(Singleton const&);
static Singleton* m_pInstance; // 单例对象指针
static mutex m_mtx; // 互斥锁
};
Singleton* Singleton::m_pInstance = nullptr;
Singleton::CGarbo Garbo;
mutex Singleton::m_mtx;
int main()
{
thread t1([] {
cout << Singleton::GetInstance() << endl;
});
thread t2([] {
cout << Singleton::GetInstance() << endl;
});
t1.join();
t2.join();
cout << Singleton::GetInstance() << endl;
cout << Singleton::GetInstance() << endl;
return 0;
}
/*
holo@jiayinhao:~/test$ ./danlimoshi
0x7fae640008c0
0x7fae640008c0
0x7fae640008c0
0x7fae640008c0
*/
类型转换
static_cast
reinterpret_cast
const_cast
dynamic_cast
前三种为了解决c语言使用不规范 ~,第四种是c++相较于c语言新增的。
class A
{
public:
virtual void f() {}
};
class B : public A
{
};
void fun(A* pa, const string& s)
{
std::cout << "pa" << s << std::endl;
B* pb1 = (B*)pa;
B* pb2 = dynamic_cast<B*>(pa); //安全的
std::cout << "[强制转换]pb1:" << pb1 << endl;
std::cout << "[dynamic_cast转换]pb2:" << pb2 << endl << endl;
//检查父类指针,如果原本指向父类对象,就转失败;
//如果原本指向子类对象,就转成功
}
int main()
{
//double d = 12.34;
//int a = static_cast<int>(d); //相似类型可以转, 整形不可转成指针 隐式类型转换
//cout << a << endl;
//int *p = reinterpret_cast<int*>(a); //重新解释的转换 ,不可用static_cast 强制类型转换
//const int a = 2;
//int* p = const_cast<int*>(&a); //对应c语言的下一行
//int* p2 = (int*)&a;
//*p = 3;
//cout << a << endl; //2
//cout << *p << endl; //3
//cout << *p2 << endl;
//加了const后,编译器优化,把a存到寄存器, 从寄存器取a.
//
//4 .dynamic_cast 动态转换 只有c++有
//指针 / 引用可转 , 对象不可转
A a;
B b;
//bb = (B)aa; //对象不可转
//dynamic转换是安全的, 强制类型转换是不安全的
fun(&a, "指向父类对象");
fun(&b, "指向子类对象");
return 0;
}
pa指向父类对象
[强制转换]pb1:0000009495EFF498
[dynamic_cast转换]pb2:0000000000000000pa指向子类对象
[强制转换]pb1:0000009495EFF4B8
[dynamic_cast转换]pb2:0000009495EFF4B8
RAII ---- 资源 请求 is 初始化
RTTI ---- :Run-time Type identifification的简称,即:运行时类型识别。
C++
通过以下方式来支持
RTTI
:
1.
typeid
运算符
cout << typeid(a).name() << endl; //class A
2.
dynamic_cast
运算符
识别指针是指向父类还是子类?
3.
decltype
常见面试题
1. C++
中的
4
中类型转化分别是:
_________
、
_________
、
_________
、
_________
2.
说说
4
中类型转化的应用场景。