前两天在一家公司面试的时候,被问到了单例模式能不能给我写一个。我给出了如下代码。
class singleton
{
protected:
singleton(){}
private:
static singleton* p;
Singleton(Singleton const&);
Singleton& operator=(Singleton const&);
public:
static singleton* instance()
{
if (p == NULL)
p = new singleton();
return p;
}
};
singleton* singleton::p = NULL;
之后 就是问多线程情况的加锁优化
class singleton
{
protected:
singleton(){}
private:
static singleton* p;
Singleton(Singleton const&);
Singleton& operator=(Singleton const&);
static mutex m_mtx;
public:
static singleton* instance()
{
if (p == NULL){
m_mtx.lock();
if (p == NULL){
p = new singleton();
}
m_mtx.unlock();
}
return p;
}
};
singleton* singleton::p = NULL;
mutex Singleton::m_mtx;
紧接着就是优化为饿汉模式了,注意我给出了如下代码:
class singleton
{
protected:
singleton(){}
private:
static singleton* p;
Singleton(Singleton const&);
Singleton& operator=(Singleton const&);
public:
static singleton* instance()
{
return p;
}
};
singleton* singleton::p = new singleton;
然后就问题出现了,他问我p=new singleton的时候有没有调用构造函数,我说有调用。
问我为什么构造函数都私有化了,为什么还可以调用。
今天太困了,我得去吃点东西休息,下次再写啦啦啦啦。。。