【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
省略。
条款三十一:根据对象类型决定如何虚化
省略。
浙公网安备 33010602011771号