博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

C/CPP-友元

Posted on 2023-03-13 09:39  乔55  阅读(8)  评论(0编辑  收藏  举报

友元的概念

// 基本概念
- 在类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的友元函数