1、类的赋值函数
class CMyString
{
public:
CMyString(char * pData=NULL);
CMyString(const CMyString &str);
~CMyString();
private:
char* m_pData;
};
一般解法:
CMyString & CMyString::operator =(const CMyString &str)
{
if(this == &str)
return *this;
delete []m_pData;
m_pData = NULL;
m_pData = new char[strlen(str.m_pData)+1];
strcpy(m_pData,str.m_pData);
return *this;
}
更好的解法:
CMyString & CMyString::operator =(const CMyString &str)
{
if(this != str)
{
CMyString temp(str);
char* pTemp = temp.m_pData;
temp.m_pData = m_pData;
m_pData = pTemp;
}
return *this;
}
参见《剑指offer》,此方法考虑了异常安全性,构建的临时对象在离开if时会自动调用析构函数,而temp和str指向的内存是一个位置,所以会释放实例的内存,达到目的。
2、单例模式
class Singleton
{
private:
Singleton(){};
static Singleton* instance = NULL;
public:
static Singleton* GetInstance()
{
if(instance == NULL)
instance = new Singleton();
return instance;
}
};
考虑自动销毁的话,则:
class Singleton
{
private:
Singleton(){};
static Singleton* instance = NULL;
class CGarbo//唯一工作时删除instance实例
{
public:
~CGarbo()
{
if(Singleton::instance) delete Singleton::instance;
}
};
static CGarbo Garbo;//定义一个静态变量,程序结束时,自动调用其析构函数
public:
static Singleton* GetInstance()
{
if(instance == NULL)
instance = new Singleton();
return instance;
}
};
3.不能被继承的类
一个类,如果不能被继承,那么当它的构造和析构函数是私有时,试图继承是,则必然会发生错误。
class NosealClass
{
public:
static NosealClass* GetInstance()
{
return new NosealClass();
}
static void DeleteInstance(NosealClass* pInstance)
{
delete pInstance;
}
private:
NosealClass(){}
~NosealClass(){}
};