《C++代码设计与重用》——2.3 Nice类

    xiaoxiao2024-08-18  89

    本节书摘来自异步社区出版社《Imperfect C++中文版》一书中的第2章,第2.3节,作者: 【美】Martin D.Carroll , Margaret A.Ellis,更多章节内容可以访问云栖社区“异步社区”公众号查看。

    2.3 Nice类

    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
    最新回复(0)