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

简介:

本节书摘来自异步社区出版社《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类。

本文仅用于学习和交流目的,不代表异步社区观点。非商业转载请注明作译者、出处,并保留本文的原始链接。

相关文章
|
1天前
|
C++
c++的学习之路:7、类和对象(3)
c++的学习之路:7、类和对象(3)
14 0
|
1天前
|
存储 编译器 C语言
c++的学习之路:5、类和对象(1)
c++的学习之路:5、类和对象(1)
10 0
|
4天前
|
存储 安全 C语言
【C++】string类
【C++】string类
|
存储 编译器 Linux
标准库中的string类(中)+仅仅反转字母+字符串中的第一个唯一字符+字符串相加——“C++”“Leetcode每日一题”
标准库中的string类(中)+仅仅反转字母+字符串中的第一个唯一字符+字符串相加——“C++”“Leetcode每日一题”
|
6天前
|
编译器 C++
标准库中的string类(上)——“C++”
标准库中的string类(上)——“C++”
|
6天前
|
编译器 C++
自从学了C++之后,小雅兰就有对象了!!!(类与对象)(中)——“C++”
自从学了C++之后,小雅兰就有对象了!!!(类与对象)(中)——“C++”
|
6天前
|
存储 编译器 C++
自从学了C++之后,小雅兰就有对象了!!!(类与对象)(上)——“C++”
自从学了C++之后,小雅兰就有对象了!!!(类与对象)(上)——“C++”
|
7天前
|
C++
【C++成长记】C++入门 | 类和对象(下) |Static成员、 友元
【C++成长记】C++入门 | 类和对象(下) |Static成员、 友元
|
7天前
|
存储 编译器 C++
【C++成长记】C++入门 | 类和对象(中) |拷贝构造函数、赋值运算符重载、const成员函数、 取地址及const取地址操作符重载
【C++成长记】C++入门 | 类和对象(中) |拷贝构造函数、赋值运算符重载、const成员函数、 取地址及const取地址操作符重载
|
11天前
|
编译器 C语言 C++
【C++初阶(九)】C++模版(初阶)----函数模版与类模版
【C++初阶(九)】C++模版(初阶)----函数模版与类模版
18 0

热门文章

最新文章