0
点赞
收藏
分享

微信扫一扫

C++友元

Silence潇湘夜雨 2022-02-28 阅读 76
c++

友元

0x00 Q&A

1.声明一个类不能被实例化?

2.声明一个类只能被指定的类使用?

3.声明一个类只能被指定的类或函数使用?

有时候,一个类A的私有数据就想被类B访问到,这时也要使用友元。

0x01 关于友元

友元就是声明朋友

友元分为友元类和友元函数。其中友元函数又可以分为友元成员函数和友元全局函数。

0x02 友元类

0x03 友元成员函数

class CFriend
{
public:
    void fun1(); // 避免下面的友元函数报错,这里将实现写在下面
};

class CString
{
    friend void CFriend::fun1(); // 友元成员函数
private:
    CString()
    {
    }
    ~CString()
    {
    }
    int Copy() {
        return 0;
    }
    int Cat() {
        return 0;
    }
};

void CFriend::fun1()
{
    // 声明为友元函数以后,可以访问类CString的所有成员,不论公有私有
    CString str;
    str.Copy();
}

0x04 友元全局函数

void ShowString();

class CString
{
    friend void ShowString(); // 友元全局函数
private:
    CString()
    {
    }
    ~CString()
    {
    }
    int Copy() {
        return 0;
    }
    int Cat() {
        return 0;
    }
};

void ShowString()
{
    CString str;
    str.Copy(); // 声明为友元函数后 str访问成员数据和方法不受访问权限限制
}

0x05 友元类可以不存在

class CFriend
{
public:
    void fun1();
};

class CString
{
    // 1.友元类可以不存在
    friend class CFriend2; // 友元类 CFriend2 可以不存在

    // 2.友元成员函数必须存在 
    //friend void CFriend::fun2(); // error C2039: "fun2": 不是 "CFriend" 的成员

    // 3.友元全局函数可以不存在
    friend void ShowString(); // 编译不会报错
    friend int main(int argc, char* argv[]); // 友元全局函数 

private:
    CString() {

    }
    ~CString() {

    }
    int Copy() {
        return 0;
    }
    int Cat() {
        return 0;
    }
};

void CFriend::fun1()
{

}

int main(int argc, char* argv[])
{
    CString str;
    str.Copy();
    return 0;
}
举报

相关推荐

0 条评论