【小甲鱼C++快速入门】P21友元关系

本文介绍了C++中的友元关系,解释了友元关系允许一个类访问另一个类的protected和private成员。通过详细讲解和示例代码,探讨了友元关系的使用和一些需要注意的细节问题。

友元关系

1.什么是友元关系

声明友元关系后可以让友元类访问到自己protected和private的属性和方法。定义友元类的语法:

firend class ****

这句话可以放在任何地方,但必须要在类里面。

2.一些细节问题

我自己写了一个例子来测试友元特性,注意看代码中的注释

#include <iostream>

//在这里最好写上声明,因为A和B的类中的方法test_visit存在交叉访问,如果先定义A,那么A就不能访问B,所以要先在这里生声明好两个类,
//告诉编译器耐心点,后面有B的定义。

class A;
class B;

//----------------------------------------------------------------------------------------------------------------------------------------------------------------------
//这里写上A的定义和A的构造函数:

class A
{
friend class B;

public:
    int a_pub;
    void test_visit(B *);
    A();

protected:
    int a_pri;

};

A::A()
{
    a_pub = 1;
    a_pri = 2;
}

//----------------------------------------------------------------------------------------------------------------------------------------------------------------------
//这里写上B的定义和B的构造函数:

class B
{
friend class A; //注意友元声明是单向的!所以这里还要再声明一次,让A也能访问到B中的private属性

public:
    int b_pub;
    void test_visit(A *);
    B();

private:
    int b_pri;

};

B::B()
{
    b_pub = 3;
    b_pri = 4;
}

//----------------------------------------------------------------------------------------------------------------------------------------------------------------------
//这里是A和B的方法定义。因为这两个方法会交叉调用,所以不能写在自己类定义的后面,要等A和B都定义好了,再来写这两个定义。

void A :: test_visit(B *pb)
{
    std::cout << pb->b_pri << std::endl;
}


void B :: test_visit(A *pa)
{
    std::cout << pa->a_pri << std::endl;
}

//----------------------------------------------------------------------------------------------------------------------------------------------------------------------

int main()
{
    B b;
    A a;
    b.test_visit(&a);
    a.test_visit(&b);

    return 0;
}

//通过这个例子可以注意到,一个比较科学的写类定义的顺序是:先写所有类的声明,然后分别写每个类的定义和构造函数,
//最后写每个类的方法定义。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值