分类: C/C++
2009-05-16 12:50:21
1.友元的作用
当某个类或者函数被授予友元关系时,该类或函数获得了对授予者(类)的私有成员的访问权。因为友元不是授予者的成员,故其不受其声明出现部分的访问控制的影响。
提示:将友元声明放在类的开始或者结尾是个好主意。
class Screen {
friend class X;
friend X& X::add(X::x, X::y, Screen &);
}
2.友元声明与作用域
为了正确的构造类,需注意友元声明与友元定义之间的互相依赖。
上例中,类X需先定义,否则screen不能将add定义为友元。一般来说,必须先定义类,才可以将类的成员函数设为友元。但,不必先声明类和非成员函数,就可将之设为友元。
class A{
friend class B;
friend void f();
}
class C{
B *y;
void c(){f()};
}
友元声明将类和非成员函数引入到外围作用域。友元函数可在类内部定义,作用域扩展至包围该类定义的作用域。
3. 重载与友元
类必须将重载函数集中每一个希望设为友元的函数设为友元。
4.友元与继承
友元不可继承,基类的友元对派生类没有特殊访问权限;
若基类被授予友元,其派生类没有对授予者的特殊访问权限。
5.类模板的友元声明
第一种:模板类授予普通函数或类友元关系;
template
{ friend class net;
friend void netBar();
}
第二种:模板类授予模板函数或模板类友元关系,友元的所有实例都有对被授予者所有实例的特殊访问权。
template
{
template
template
}
net所有实例可以访问Bar的所有实例;netBar亦同。
第三种:模板类授予模板函数或模板类的部分实例友元关系。
template
template
template
{
template
template
}
Bar
注意:对于第一、二种,不须对模板类和函数进行声明。编译器将友元声明当做声明对待。但在第三种中,必须在友元声明前生明前声明模板类和函数。如果不提前声明,编译器将之看做普通的类或函数。