0

我刚刚开始学习 C++ 中的友元函数。这是我用于概念探索的程序。

#include<iostream>

using namespace std;

class one
{
private:
    int age;
public:
    one()
    {
        age=1;
    }
    void setData(int num)
    {
        age=num;
    }
friend int returnOne(one a);
};
int returnOne(one a)
{
    return a.age;
}


class two
{
private:
    int roll;
public:
    two()
    {
        roll=0;
    }
    void setData(int num)
    {
        roll=num;
    }
friend int returnTwo(two b);
};

int returnTwo(two b)
{
    return b.roll;
}


int main()
{
    one a;
    two b;
    a.setData(10);
    b.setData(12);
    cout<<returnOne(a)<<endl<<returnTwo(b)<<endl;
} 

现在我担心 class 的安全性one已经two受到损害,因为现在任何人都可以使用这些全局定义的朋友函数来访问 classone和 classtwo的私有成员。如何为这些好友功能提供保护或限制其使用?

4

2 回答 2

2

friend船是相互的。除非在类定义中将函数声明为友元,否则函数不能成为友元,因此这是一种选择。如果你做到了,你就必须忍受它。让一个函数成为朋友然后试图阻止它访问类内部是没有意义的,因为这正是关键字的目的friend

不要滥用或误解友谊。友谊用于表示两个实体之间有意的强耦合。如果两个实体之间存在特殊关系,一个需要访问其他私有或受保护成员,但您不希望每个人都可以通过使用公共访问说明符来访问,那么您应该使用友谊。

于 2013-08-28T08:22:52.137 回答
0

在类中声明友元函数会扩展类public接口。您基本上是在使用更多功能扩展类(以紧密耦合这些功能为代价)。

所以你不能阻止人们使用这些函数,就像你不能阻止人们在你的类上使用公共成员方法一样(它们都是公共接口的一部分)。

但是你可以重新设计你的朋友函数,这样它们就不会暴露实现细节。
为什么不operator<<为您的类定义而不是访问特定成员的函数(这是假设您只是为流式传输提供这些函数(如果没有,则重点是静音))。

std::ostream& operator<<(std::ostream& s,two const& b)
{
    return s << b.roll;
}
于 2013-08-28T09:12:13.363 回答