1、不允许复制的类
声明:私有的复制构造函数、私有的拷贝构造函数(不需要具体实现,就可以实现目的)
private:
President& operator= (const President &); // 赋值构造运算符
President(const President&); // 拷贝构造函数
再像如下操作时,便会出错:
President ourPresident;
....
President clone = ourPresident; // ERROR
2、只能有一个实例的单例类 —— 单例的概念
私有构造函数、私有赋值运算符、静态实例成员
static:
a、类的数据成员。所有实例间贡献,属于类,不属于对象
b、类的成员函数。该函数在所有成员之间共享(数据+函数 ???)
// 《21天学通C++》
class President {
private:
President() {}; // private default constructor
President(const President&); // private copy constructor
const President& operator=(const President&); // assignment operator
string name;
public:
static President& GetInstance() {
static President onlyInstance;
return onlyInstance;
}
string GetName() {
return name;
}
void SetName(string InputName) {
name = InputName;
}
};
首先:President() {}; 私有后,新定义变量,或者new一个都会错。只能通过调用引用,而不能再构造
// cannot access constructor 欲使用默认构造函数,失败(私有的)
President second;
// cannot access constructor 欲使用默认构造函数,失败(私有的)
President* third= new President();
其次:复制构造会失败
// 通过该函数去拿到全局的对象实例
President& onlyPresident = President::GetInstance();
// cannot access copy constructor:欲使用复制/赋值构造函数,但私有的,无法使用
President fourth = onlyPresident; // 在创建对象的同时赋值将调用赋值构造函数
最后: = 会失败
President& onlyPresident = President::GetInstance();
// cannot access operator=
onlyPresident = President::GetInstance();
3、不允许在栈中实例化类—— 析构private
class MonsterDB
{
private:
~MonsterDB(); // private destructor
//... members that consume a huge amount of data
};
int main()
{
MonsterDB myDatabase; // compile error
// … more code
return 0;
}
退栈时,将弹出栈中的所有对象,编译器需要在 main( )末尾。调用析构函数~MonsterDB(),但这个析构函数是私有的。用new,可以在堆上创建,但此时不能调用析构函数(内存泄露),因此要显性的调用内存释放函数(提供一个静态的公有函数,用以删除内存)。
class MonsterDB
{
private:
~MonsterDB() {}; // private destructor prevents instances on stack
public:
static void DestroyInstance(MonsterDB* pInstance
{
delete pInstance; // member can invoke private destructor
}
void DoSomething() {} // sample empty member method
};
int main()
{
MonsterDB* myDB = new MonsterDB(); // on heap
myDB->DoSomething();
MonsterDB::DestroyInstance(myDB);
return 0;
}
4、