《C++代码设计与重用》——2.3 Nice类
本节书摘来自异步社区出版社《Imperfect C++中文版》一书中的第2章,第2.3节,作者: 【美】Martin D.Carroll , Margaret A.Ellis,更多章节内容可以访问云栖社区“异步社区”公众号查看。2.3 Nice类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类。
本文仅用于学习和交流目的,不代表异步社区观点。非商业转载请注明作译者、出处,并保留本文的原始链接。
开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!
更多推荐
所有评论(0)