strchr函数用法_c++ strchr函数_strchr函数原型(8)

电脑杂谈  发布时间:2017-02-28 18:06:59  来源:网络整理

定义:多重继承允许子类拥有多个基类.要将作为纯接口的基类和具有实现的基类区别开来.

优点:相比单继承(见继承),多重实现继承可以复用更多的代码.

缺点:真正需要用到多重实现继承的情况少之又少.多重实现继承看上去是不错的解决方案,但你通常也可以找到一个更明确,更清晰的不同解决方案.

结论:只有当所有父类除第一个外都是纯接口类时,才允许使用多重继承.为确保它们是纯接口,这些类必须以Intece为后缀.

接口:接口是指满足特定条件的类,这些类以Intece为后缀(不强制).

定义:当一个类满足以下要求时,称之为纯接口:(1)、只有纯虚函数(“=0”)和静态函数(除了下文提到的析构函数).(2)、没有非静态数据成员.(3)、没有定义任何构造函数.如果有,也不能带有参数,并且必须为protected.(4)、如果它是一个子类,也只能从满足上述条件并以Intece为后缀的类继承.

接口类不能被直接实例化,因为它声明了纯虚函数.为确保接口类的所有实现可被正确销毁,必须为之声明虚析构函数(作为上述第1条规则的特例,析构函数不能是纯虚函数).具体细节可参考Stroustrup的TheC++ProgrammingLanguage,3rdedition第12.4节.

优点:以Intece为后缀可以提醒其他人不要为该接口类增加函数实现或非静态数据成员.这一点对于多重继承尤其重要.另外,对于Java程序员来说,接口的概念已是深入人心.

缺点:Intece后缀增加了类名长度,为阅读和理解带来不便.同时,接口特性作为实现细节不应暴露给用户.

结论:只有在满足上述需要时,类才以Intece结尾,但反过来,满足上述需要的类未必一定以Intece结尾.

运算符重载:除少数特定环境外,不要重载运算符.

定义:一个类可以定义诸如+和/等运算符,使其可以像内建类型一样直接操作.

优点:使代码看上去更加直观,类表现的和内建类型(如int)行为一致.重载运算符使Equals(),Add()等函数名黯然失色.为了使一些模板函数正确工作,你可能必须定义操作符.

缺点:虽然操作符重载令代码更加直观,但也有一些不足:(1)、混淆视听,让你误以为一些耗时的操作和操作内建类型一样轻巧.(2)、更难定位重载运算符的调用点,查找Equals()显然比对应的==调用点要容易的多.(3)、有的运算符可以对指针进行操作,容易导致bug.Foo+4做的是一件事,而&Foo+4可能做的是完全不同的另一件事.对于二者,编译器都不会报错,使其很难调试;(4)、重载还有令你吃惊的副作用.比如,重载了operator&的类不能被前置声明.

结论:

(1)、一般不要重载运算符.尤其是赋值操作(operator=)比较诡异,应避免重载.如果需要的话,可以定义类似Equals(),CopyFrom()等函数.

(2)、然而,极少数情况下可能需要重载运算符以便与模板或“标准”C++类互操作(如operator<<(ostream&,constT&)).只有被证明是完全合理的才能重载,但你还是要尽可能避免这样做.尤其是不要仅仅为了在STL容器中用作键值就重载operator==或operator<;相反,你应该在声明容器的时候,创建相等判断和大小比较的仿函数类型.

有些STL算法确实需要重载operator==时,你可以这么做,记得别忘了在文档中说明原因.

存取控制:将所有数据成员声明为private,并根据需要提供相应的存取函数.例如,某个名为foo_的变量,其取值函数是foo().还可能需要一个赋值函数set_foo().


本文来自电脑杂谈,转载请注明本文网址:
https://www.pc-fly.com/a/jisuanjixue/article-35033-8.html

相关阅读
    发表评论  请自觉遵守互联网相关的政策法规,严禁发布、暴力、反动的言论

    • 马春雨
      马春雨

      在这个颜即正义的大网络时代

    热点图片
    拼命载入中...