Effective C++条款06解读 : 若不想使用编译器自动生成的函数, 就应该明确拒绝

       我们知道, C++编译器经常在背地里捣鬼, 定义一些默认的函数。 那如果不想用编译器生成的这些默认函数, 该怎么办呢? 很简单: 我们自己去明确声明, 不让编译器来骚扰。

       比如, 如果我们要阻止类的使用进行对象拷贝和复制, 可采用如下的方式:

 

#include <iostream>
using namespace std;

class A
{
public:
	// ...
	A()
	{
	
	}

	~A()
	{
	
	}
	
private:
	// 私有化
	
	A(const A&)
	{
	
	}

	A& operator= (const A&)
	{
	
	}
};

int main()
{
	A a;
	A b;

	A c(a);  // 调用拷贝构造函数, 有error
	A d = b; // 调用拷贝构造函数, 有error
	b = a;   // 调用赋值函数, 有error

	return 0;
}

 

       上述程序会出现编译错误, 可见, 私有化起到了作用。 

 

       另外一个在笔试、面试中常被问到的问题是: 如何确保一个类的对象不超过一个? 如下:

 

#include <iostream>
using namespace std;

class A
{
private:
	// 禁止直接通过构造函数来生成对象
	A()
	{
	
	}

public:
	A *getInstance()
	{
		static A *p = NULL;
		if(NULL == p)
		{
			p = new A();
		}

		return p;
	}
};

int main()
{
	return 0;
}

       实际上, 我们通过私有化驳回了编译器默认的构造函数, 所以, 类的使用者无法直接通过构造函数生成对象, 比如用getInstance, 而这个就是大家熟悉的单例。

 

 

        OK, 本文先说这么多。

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值