《Effective C++》Item6: 如果你不想使用编译器生成的函数,就该明确拒绝!

        通过对item5的学习我们知道:编译器会暗自为class创建default构造函数、copy构造函数、copy assignment操作符以及析构函数。
        but,有时候我们不希望我们的类有某些特定功能,通常的做法就是不声明具有这些功能的函数就可以了,however,对于某些与生俱来的功能——比如copy构造和copy assignment,即使我们不声明,系统也会自动生成。
        解决办法是可以在类中声明copy构造函数和copy assignment操作符,但并不实现这些函数,并将其声明为private,这样就可以阻止编译器自动生成默认函数,又可以阻止别人调用这些功能。

        例如:

// PrivateConstructor.cpp : 定义控制台应用程序的入口点。
//

#include "stdafx.h"
#include <iostream>

using namespace std;

class HomeForSale
{
private:
	HomeForSale(const HomeForSale&);            //声明一个copy构造函数,并不实现它,连变量名字都没有起
	HomeForSale& operator=(const HomeForSale&); //声明一个copy assignment操作符,并不实现它

	double price;
	double area;
public:
	HomeForSale(double price, double area):price(price),area(area){}
};

int _tmain(int argc, _TCHAR* argv[])
{
	HomeForSale home(1000, 2000);
	HomeForSale home1(home); //error:无法访问 private 成员(在“HomeForSale”类中声明)
	HomeForSale home2 = home;//error:无法访问 private 成员(在“HomeForSale”类中声明)
	return 0;
}

        编译的时候就会报出“error C2248: “HomeForSale::HomeForSale”: 无法访问 private 成员(在“HomeForSale”类中声明)”这样的错误!

        有了这样的声明(而不是定义),当客户企图拷贝HomeForSale对象时,编译器就会阻止他,如果不慎在类的其他成员函数或者friend函数中做了这样的事,就会出现link error。

        以下方法可以将连接错误移至编译期:

// PrivateConstructor.cpp : 定义控制台应用程序的入口点。
//

#include "stdafx.h"
#include <iostream>

using namespace std;

class Uncopyable
{
protected:
	Uncopyable(){}
	~Uncopyable(){}
private:
	Uncopyable(const Uncopyable&);
	Uncopyable& operator=(const Uncopyable&);
};

class HomeForSale: private Uncopyable
{
private:
	double price;
	double area;
public:
	HomeForSale(double price, double area):price(price),area(area){}
};

int _tmain(int argc, _TCHAR* argv[])
{
	HomeForSale home(1000, 2000);
	//HomeForSale home1(home); //error:无法访问 private 成员(在“HomeForSale”类中声明)
	//HomeForSale home2 = home;//error:无法访问 private 成员(在“HomeForSale”类中声明)
	return 0;
}

        根据item5我们知道:如果某个base class将copy assignment操作符声明为private,编译器将拒绝为其derived classes生成一个copy assignment操作符,因为如果生成了,那么derived classes中的copy assignment操作符就必须能够调用base class中的copy assignment操作符进行处理继承下来的base class中的成员,而base class中的copy assignment操作符被声明成了private的,无法调用,所以相互矛盾。







  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值