Effective C++笔记: 构造/析构/赋值运算(一)

  条款05:Know what functions C++ silently writes and calls

  1. 对一个空类,C++默认生成构造,析构,拷贝构造,和赋值(operate=)函数

 

  2. 这些函数并不一定生成,而是在需要时,才会被编译器创建出来。

 

  3. 默认的拷贝构造和赋值函数只能实现简单的拷贝,对引用或const成员变量需要自己实现拷贝构造和赋值函数。

  

  条款06: 若不想使用默认函数,明确的拒绝

  1.通过将拷贝构造,赋值等函数声明为private来避免编译器默认构造和用户调用,如

class HomeForSale {
public:
  ...

private:
  ...
 
HomeForSale(const HomeForSale&);            // declarations only
 
HomeForSale& operator=(const HomeForSale&);
};

 

但这样还不能避免成员函数或friend函数的访问,为此可以使用这样的基类:

class Uncopyable {
protected:                                   // allow construction
  Uncopyable() {}                            // and destruction of
  ~Uncopyable() {}                           // derived objects...

private:
  Uncopyable(const Uncopyable&);             // ...but prevent copying
  Uncopyable& operator=(const Uncopyable&);
};

为了阻止拷贝 HomeForSale objects(对象),我们现在必须让它从 Uncopyable 继承:

class HomeForSale: private Uncopyable {      // class no longer
  ...                                        // declares copy ctor or
};                                           // copy assign. operator

这样就能避免任何对HomeFroSale的拷贝构造和赋值操作。

 

更多的问题:

Uncopyable 的实现和使用包含一些微妙之处,比如,从 Uncopyable 继承不必是 public(公有)的(参见 Item 32 39),而且 Uncopyable destructor(析构函数)不必是 virtual(虚拟)的(参见 Item 7)。因为 Uncopyable 不包含数据,所以它符合 Item 39 描述的 empty base class optimization(空基类优化)的条件,但因为它是 base class(基类),此项技术的应用不能引入 multiple inheritance(多继承)(参见 Item 40)。反过来说,multiple inheritance(多继承)有时会使 empty base class optimization(空基类优化)失效(还是参见 Item 39)。

 

条款07:为多态基类声明virtual析构函数

1.     因为 C++ 规定:当一个 derived class object(派生类对象)经由一个 base class的指针被删除,而该base class带有一个non virtual的析构函数,则结果是未定义的。运行时比较典型的后果是 derived part of the object(这个对象的派生部分)不会被析构。

 

2.     当一个类不意图被用作一个base class的时候,不用设析构为virtual(为了避免引入不必要的vtbl

 

如果一个类不想被实例化,但又要被当成base class,可以为其提供一个纯虚的析构函数。

这是一个例子:

class AWOV {                            // AWOV = "Abstract w/o Virtuals"
public:
  virtual ~AWOV() = 0;                  // declare pure virtual destructor
};

但请注意,必须为 pure virtual destructor(纯虚拟析构函数)提供一个 definition(定义):

AWOV::~AWOV() {}        // definition of pure virtual    dtor

 

3. 如果一个类包含任何virtual函数,那应该将其析构设为virtual

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值