【More Effective C++】技术

条款二十五:虚化constructor和non-member function

  • 虚化constructor是指根据传入的参数构造出不同的对象:利用一个virtual member function来完成
 1 //基类
 2 class Base{
 3 public:
 4    virtual Base* clone() const = 0;
 5    ...
 6 };
 7 //子类A
 8 class DerivedA: public Base{
 9 public:
10    virtual DerivedA* clone() const{
11       return new DerivedA(*this);     
12    }
13   ...
14 };
15 //子类B
16 class DerivedB: public Base{
17 public:
18    virtual DerivedB* clone() const{
19       return new DerivedB(*this);     
20    }
21   ...
22 };
23 //类集合,包含不同的子类
24 class Classes{
25 public:
26    Classes(const Classes& rhs){ //拷贝构造函数,根据父本中类型自动构造
27       for(auto it=rhs. BaseList.begin(); it!=rhs. BaseList.end(); ++it){
28           BaseList.push_back((*it).clone());
29       }
30    }
31 private:
32    list<Base*> BaseList;
33 };
  • 虚化non-member function:同样的写一个虚函数做实际工作,然后写一个非虚函数调用。
 1 //基类
 2 class Base{
 3 public:
 4    virtual void print() const = 0;
 5    ...
 6 };
 7 //子类A
 8 class DerivedA: public Base{
 9 public:
10    virtual void print() const{
11       ...     
12    }
13   ...
14 };
15 //子类B
16 class DerivedB: public Base{
17 public:
18    virtual void print() const{
19       ...    
20    }
21   ...
22 };
23 //virtual non-member function
24 void func(const Base & rhs){
25    rhs.print();
26 }

 

条款二十六:限制类能够产生的对象的数量

  •  禁止产生对象,可以将其constructors声明为private
  • 只能产生一个对象,禁用constructors,并写一个返回静态对象的public member function。
  • 任意个数的对象:构建一个用来计数的类,当调用constructors是减一,析构时加一。

 

条款二十七:要求或者禁止对象产生与heap中

  •  要求对象必须产生在heap中:将deconstructors声明为private,原理为栈中对象会自动调用constructor和deconstructor如果将其定义为不合法就可以实现
  • 判断对象是否在heap中:重写operator new,将heap中的地址记录下来,然后判断。
  • 禁止对象产生在heap中:将operator new声明为private

 

条款二十八:智能指针

 省略。

 

条款二十九:引用技术

  省略。

 

条款三十:Proxy class

  省略。

 

条款三十一:根据对象类型决定如何虚化

省略。

 

posted @ 2022-03-12 19:41  axingzheng  阅读(31)  评论(0)    收藏  举报