通过构造、析构来控制类的属性

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、

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值