友元的概念
// 基本概念
- 在类Test内将外部XX声明为Test类的友元类或友元函数,则Test函数可以访问Test所有成员
- 友无关系3大特点
- 友元关系不能被继承
- 友元关系是单向的,如A是C是友元类,但并不表示C是A的友元类
- 友元关系不能传递性,如,A是B友元,B是C的友元,并不表示A是C的友元
- 友元的优缺点
- 优点:允许在特定情况下某些非成员函数访问类的private,protected成员
- 缺点:破坏了封装性
//
// 友元的特点
- 一个常规的成员函数声明,描述了3件在逻辑上互不相同的事情
- 该函数能访问类声明的private部分
- 该函数位于类的作用域之中
- 该函数必须经由一个对象去激活(有一个this指针)
- 将该函数声明为static,可以让它只有前2个性质
- 将该函数声明为友函数,可以让它只具有第1个性质
class Test
{
// 将某函数声明Test类的友元函数之后,就是希望通过该函数可以访问该类的private成员
// 而不必非得通过public的成员函数来访问private成员
friend void xxx_print(Test& t);
private:
int data;
public:
Test(int d = 0) :data(d){ }
// 1、成员函数xxx_fun可以访问Test类的private成员
void xxx_fun()
{
cout << "data=" << data << endl;
}
};
void test()
{
Test t(100);
// 2、下句调用出错:未定义标识符
// 即该函数只在类Test作用域内
// xxx_fun();
// 3、下句调用出错:非静态成员引用必须与特定对象相对
// 即该函数必须经由一个对象去激活(有一个this指针)
// Test::xxx_fun();
t.xxx_fun();
}
void xxx_print(Test& t)
{
cout << "friend" << endl;
cout << t.data << endl;
}
// 友元函数注意点
1. // 友元函数不是类的成员函数,在函数体中访问对象的成员,必须用t.data方式。
2. // 友元函数可以访问类的所有成员,一般函数只能访问类中public成员
3. // 友元函数不受类中访问权限关键字限制,可将其放在任一权限下,结果都一样
4. // 某类的友元函数的作用域并非该类的作用域。
5. // 整个类A可以是另一个类B的友元类。A的每个成员函数都是类B的友元函数