本节书摘来自异步社区出版社《Imperfect C++中文版》一书中的第2章,第2.3节,作者: 【美】Martin D.Carroll , Margaret A.Ellis,更多章节内容可以访问云栖社区“异步社区”公众号查看。
C++代码设计与重用2.3 Nice类我们都知道类会提供某些函数,这些函数要么是在类的代码中被显式声明为公共的(public)或保护的(protected),要么是由编译器在程序需要这些代码时隐式生成的。例如,下面这个类:
class X{ public: X(); void f(); };它提供了一个缺省构造函数、函数f、一个拷贝构造函数、一个赋值运算符和一个析构函数。而且最后3个函数会在程序需要它们的时候由编译器自动生成。
请考虑下面这个通常有用的函数:
template<class T> void swap(T& t1, T& t2){ T t=tl; tl=t2; t2=t; }如果x1和x2是某个类X的两个对象,那么我们就可以通过调用swap函数来交换它们的值:
swap(x1, xz);为了使上面这行代码能够通过编译,类X必须提供一个拷贝构造函数、一个赋值运算符和一个析构函数。
现在让我们再来研究另一个通常有用的类:
template<class T> class Array { private: T* rep; public: Array(int size) { rep = new T[size]; //... } int size() const; T operator[](int i) const; //... };基于上面代码段,如果想创建一个含有20个X对象的Array数组,我们可以这样编写代码:
Array<X>array(20);为了使上面这行代码可以顺利通过编译,X必须提供一个缺省构造函数—否则Array构造函数中的new调用将会是非法调用。
最后,考虑下面一个通常有用的函数:
template<class T> bool linear_search(const Array<T>& a, const T& t) { for(i = 0; i<a.size(); ++i) if(a[i] ==t) return true; return false; }为了在array数组中查找一个值为x的X对象,我们可以编写如下代码:
if(1inear_search(array, x)) //...为了使这行代码能顺利通过编译,类X必须提供相等运算符,或者能够转型一个新的类型,而该类型提供了相等运算符。
下列函数的使用范围非常广;以至于,如果一个类提供了下列所有函数,我们就称这个类为nice类:
缺省构造函数;拷贝构造函数;赋值运算符;相等运算符;析构函数。非nice类限制了类的使用性,这种限制有时候是很严重的。因此,可重用类应该尽可能地设计成nice类。
本文仅用于学习和交流目的,不代表异步社区观点。非商业转载请注明作译者、出处,并保留本文的原始链接。
相关资源:敏捷开发V1.0.pptx