Google C++编程风格指南(三):C++类
类没有额外数据成员,甚至父类也没有任何数据成员的特殊情况下,析构函数的调用是否必要是语义争论,从编程设计规范的角度看,在含有虚函数的父类中,定义虚析构函数绝对必要。
限定仅在子类访问的成员函数为protected,需要注意的是数据成员应始终为私有。 当重定义派生的虚函数时,在派生类中明确声明其为virtual。根本原因:如果遗漏virtual,阅读者需要检索类的所有祖先以确定该函数是否为虚函数(译者注,虽然不影响其为虚函数的本质)。 7. 多重继承(Multiple Inheritance) 真正需要用到多重实现继承(multiple implementation inheritance)的时候非常少,只有当最多一个基类中含有实现,其他基类都是以Interface为后缀的纯接口类时才会使用多重继承。 定义:多重继承允许子类拥有多个基类,要将作为纯接口的基类和具有实现的基类区别开来。 优点:相比单继承,多重实现继承可令你重用更多代码。 缺点:真正需要用到多重实现继承的时候非常少,多重实现继承看上去是不错的解决方案,通常可以找到更加明确、清晰的、不同的解决方案。 结论:只有当所有超类(superclass)除第一个外都是纯接口时才能使用多重继承。为确保它们是纯接口,这些类必须以Interface为后缀。 注意:关于此规则,Windows下有种例外情况(译者注,将在本译文最后一篇的规则例外中阐述)。 8. 接口(Interface) 接口是指满足特定条件的类,这些类以Interface为后缀(非必需)。 定义:当一个类满足以下要求时,称之为纯接口: 1) 只有纯虚函数("=0")和静态函数(下文提到的析构函数除外); 2) 没有非静态数据成员; 3) 没有定义任何构造函数。如果有,也不含参数,并且为protected; 4) 如果是子类,也只能继承满足上述条件并以Interface为后缀的类。 接口类不能被直接实例化,因为它声明了纯虚函数。为确保接口类的所有实现可被正确销毁,必须为之声明虚析构函数(作为第1条规则的例外,析构函数不能是纯虚函数)。具体细节可参考Stroustrup的《The C++ Programming Language, 3rd edition》第12.4节。 优点:以Interface为后缀可令他人知道不能为该接口类增加实现函数或非静态数据成员,这一点对于多重继承尤其重要。另外,对于Java程序员来说,接口的概念已经深入人心。 缺点:Interface后缀增加了类名长度,为阅读和理解带来不便,同时,接口特性作为实现细节不应暴露给客户。 结论:。只有在满足上述需要时,类才以Interface结尾,但反过来,满足上述需要的类未必一定以Interface结尾。 9. 操作符重载(Operator Overloading) 除少数特定环境外,不要重载操作符。 定义:一个类可以定义诸如+、/等操作符,使其可以像内建类型一样直接使用。 优点:使代码看上去更加直观,就像内建类型(如int)那样,重载操作符使那些Equals()、Add()等黯淡无光的函数名好玩多了。为了使一些模板函数正确工作,你可能需要定义操作符。 缺点:虽然操作符重载令代码更加直观,但也有一些不足 1) 混淆直觉,让你误以为一些耗时的操作像内建操作那样轻巧; 2) 查找重载操作符的调用处更加困难,查找Equals()显然比同等调用==容易的多; 3) 有的操作符可以对指针进行操作,容易导致bugs,Foo + 4做的是一件事,而&Foo + 4可能做的是完全不同的另一件事,对于二者,编译器都不会报错,使其很难调试; 4) 重载还有令你吃惊的副作用,比如,重载操作符&的类不能被前置声明。 结论: 一般不要重载操作符,尤其是赋值操作(operator=)比较阴险,应避免重载。如果需要的话,可以定义类似Equals()、CopyFrom()等函数。 然而,极少数情况下需要重载操作符以便与模板或“标准”C++类衔接(如operator<<(ostream&, const T&am |
凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢! |