9.9 小结

    本章继续讨论了面向对象编程的一些概念,之所以称为“高级专题”,是因为讲述的内容都是基于前面对类和对象的介绍。首先,结合第6章中讲述的作用域、可见域和生存期的知识对类作用域、类定义的作用域和可见域以及对象的生存期、作用域和可见性进行了介绍。

    C++引入了友元函数来对类的接口进行扩展,大大提高了外部访问的灵活性,但这在一定程度上也破坏了类的封装性。违反了信息隐藏的原则,因此,对友元的使用要合理,好钢用在刀刃上。

    运算符重载是很重要的内容,合理重载运算符能够使程序编写简便灵活而且高效,除了极个别的运算符外,绝大多数的运算符都可被重载。运算符重载有成员函数形式和友元函数形式两种,两种方式各有优缺点,对一些运算符来说,只能采用成员函数的形式。

    运算符重载不改变其优先级和结合性,而且用户只能重载C++定义的运算符,不可自己创新臆造,虽然C++允许改变运算符的语义,但不推荐这样做,它会让程序员和阅读程序的人思维混乱,随后结合范例讲解了运算符重载的用法,由于篇幅有限,这里的范例只能起到抛砖引玉的功能,如何用好运算符重载得益于知识的积累,以及程序员的感悟,还有更重要的一点便是想象力和创造力。

    类对象和其他类型的对象之间也可以相互转化,发生转化的场合和第2章中所介绍的完全一致,不同之处在于“由其他类型对象向自定义类的转换是通过构造函数来完成的,而由自定义类向其他类型对象的转换是由转换函数来完成的”。

    最后,本文简要讨论了编译器是如何从众多重载函数版本中选择最优的,如果编译器无法从给出的函数定义中选择最合适的版本,将会指出程序存在二义性(Ambiguous)错误。