Effective C++之条款05、06

条款05:了解C++默默编写并调用哪些函数

    当声明一个空类时,编译器会为它声明一个copy构造函数、一个copy assignment操作符和一个析构函数。此外如果没有声明任何构造函数,编译器也会为你声明一个default构造函数。因此,如果你写下:

class Empty();

这就好像你写下这样的代码:

class Empty{
public:
	Empty() {...}                     //default构造函数
	Empty(const Empty &rhs) {...}     //copy构造函数
	~Empty() {...}                    //析构函数
	Empty& operator=(cosnt Empty& rhs) {...}  //copy assignment操作符
};

只有当这些函数需要被调用时,它们才会被编译出来。

注意

  • 当class中包含const成员时,编译器拒绝生成copy assignment操作符。
  • 当基类的copy assignment操作符声明为private,编译器将拒绝为其派生类生成一个copy assignment操作符。

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

    有些时候,一个类不应该有copy构造函数和copy assigment操作符,但是你不能不创建它们,因为在条款05中已经明确指出,编译器暗自创建其专属版本。当然你可以创建一个private属性的copy构造函数和copy assginment操作符,但这种做法并不安全。因为成员函数和友元函数还是可以调用private函数。常用的解决办法是声明为private并且不实现它们。

class HomeForSale {
public:
	...
private:
	...
	HomeForSale(const HomeForSale&);               //只有声明的copy构造函数
	HomeForDale& operator=(const HomeForSale&);    //只有声明的copy assignment操作符
};

    有了上述class定义以后,当客户企图拷贝HomeForSale对象,编译器会阻挠他。如果不慎在member函数或友元函数之内这么做,连接器会发出阻止。

    另一种做法是为组止copying动作,专门设计一个base class:

class Uncopyable() {
protected:
	Uncopyable() {}       //允许派生类对象构造和析构
	~Uncopyable() {}
private:
	Uncopyable(const Uncopyable&);         //阻止copying
	Uncopyable& operator=(const Uncopyable&);
};

class HomeForSale: private Uncopyable {
	...
};

    这样声明之后,派生类只需继承基类,不需要再去声明这些函数。当成员函数或者友元函数尝试调用这些函数时,编译器会尝试调用其基类对应的兄弟,但是会被拒绝,因为基类的拷贝函数是private。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值