C++友元函数

先解决一个“历史遗留”问题
前面我们在写类和对象总结时提出了一个问题:如何访问私有成员?
当时我们只给出了两种解决方案:一种是通过设置一个共有的成员函数接口来访问,另一种是通过指针来访问。
今天给出第三种解决方案:通过友元函数来访问私有成员。

class Date
{
    friend void PrintInfo(const Date& d);   //声明友元函数
public:
    Date(int year,int month,int day)
        :_year(year)
        , _month(month)
        , _day(day)
    {}
private:
    int _year;
    int _month;
    int _day;
};
void PrintInfo(const Date& d)
{ 
    cout << d._year << "." << d._month << "." << d._day << endl;
}
int main()
{
    Date d(2018, 7, 30);
    PrintInfo(d);
    return 0;
}


从结果来看,我们成功了。

接下来进入正题,更加详细的给大家介绍什么是友元

友元

友元分为两类:友元函数 和 友元类

1 友元函数
从上面的例子可以得出结论,友元函数可以直接访问类的私有成员,它是定义在类外的普通函数,不属于任何类,但需要在类内部声明,声明时在函数前面加上friend关键字。
友元函数说明:
●友元函数可以访问私有成员,但不是类的成员函数
●友元函数不能用const修饰
●友元函数可以在类定义的任何地方声明,不受访问限定符限制
●一个函数可以是多个类的友元函数
●友元函数的调用和普通函数调用原理相同

2 友元类

//格式:friend 类名;
friend B;

友元类的所有成员函数都可以是另一个类的友元函数,都可以访问另一个类中的成员函数。

友元类注意点:
●友元类的关系是单向的而不是双向的。例如声明了B类是A类的友元类,就不能用A类中的成员函数访问B类中的私有成员
●友元的关系不能传递,例如声明了C类是B类的友元,B类是A类的友元,不等于C类是A类的友元。
●友元关系不能被继承

优缺点:
●优点:提高了程序运行效率。
●缺点:破坏了类的封装性和隐蔽性。

全部评论

相关推荐

点赞 收藏 评论
分享
牛客网
牛客企业服务