一句话总结:C++类中4个自动生成的函数需为私有,注意线程安全。
看下boost::non copyable的定义,当继承时构造函数、析构函数、赋值函数、拷贝构造函数均默认变成私有,注意基类中的构造函数和析构函数不能为private,否则子类不可见,不能继承:
#ifndef BOOST_NONCOPYABLE_HPP_INCLUDED
#define BOOST_NONCOPYABLE_HPP_INCLUDED
namespace boost {
// Private copy constructor and copy assignment ensure classes derived from
// class noncopyable cannot be copied.
// Contributed by Dave Abrahams
namespace noncopyable_ // protection from unintended ADL
{
class noncopyable
{
protected:
noncopyable() {}
~noncopyable() {}
private: // emphasize the following members are private
noncopyable( constnoncopyable& );
constnoncopyable& operator=(const noncopyable& );
};
}
typedefnoncopyable_::noncopyable noncopyable;
} // namespace boost
#endif // BOOST_NONCOPYABLE_HPP_INCLUDED
1、饿汉式单例模式是线程安全的,
class CSingleton
{
private:
CSingleton()
{
}
public:
int m;
staticCSingleton instance; //声明
staticCSingleton * GetInstance()
{
return &instance;
}
};
CSingleton CSingleton::instance; //初始化
2、懒汉模式需要注意线程安全,加锁
#include "pthread.h"
class Singleton
{
private:
staticSingleton* m_instance;
Singleton(){}
public:
staticSingleton* getInstance();
};
pthread_mutex_t mutex;
Singleton* Singleton::getInstance()
{
if(NULL ==m_instance)
{
pthread_mutex_lock(&mutex);
if(NULL ==m_instance)
{
m_instance =new Singleton;
}
pthread_mutex_unlock(&mutex);
}
returnm_instance;
}