友元的概念是否有悖于 OOP ?
由于友元允许非成员函数访问私有数据,乍一想,可能会认为它违反了 OOP 的数据隐藏规则,其实不然。相反,应该将友元看做是类的扩展接口的组成部分。例如,从概念上看,double * Time 和 Time * double 是完全相同的。也就是说,前一个要求有友员函数,后一个使用成员函数,这是 C++ 句法的结果,而不是概念上的差别。通过使用友元函数和类方法,可以用同一个用户接口表达这两种操作。另外需要记住的是:只有类声明可以决定哪一个函数是友元,因此类声明仍然控制了哪些函数可以访问私有数据。可以打个比方,主人(类)一般只允许客人参观大厅、厨房这两个地方,但不允许参观其寝室,书房,然后特别要好的朋友(友元)除外,亦是参不参观寝室书房,完全由主人决定。总之,类方法和友元只是表达类接口的两种不同机制。