友元函数、友元类、友元成员函数

在C++中,友元(friend)是一种特殊的访问权限,允许一个函数或类访问另一个类的私有成员。友元可以是函数、类,甚至是整个类。在本篇博客中,我们将讨论友元函数、友元类和友元成员函数,并提供相应的示例代码。

友元函数

在C++中,可以将**一个函数声明为另一个类的友元函数。这意味着该函数可以访问该类的所有成员,包括私有成员。**下面是一个示例:

class Men {
private:
    void test() {
        std::cout << "Men类里面的private成员函数" << std::endl;
    }
    friend void func(Men&); // 声明func为Men的友元函数
};

void func(Men& m) {
    m.test(); // 可以访问Men的私有成员函数test
}

int main() {
    Men men;
    func(men);
    return 0;
}

在上面的示例中,func函数被声明为Men类的友元函数,因此可以访问Men的私有成员函数test。

友元类

除了友元函数外,**C++还允许将一个类定义为另一个类的友元类。这意味着友元类可以访问另一个类的所有成员,包括私有成员。**下面是一个示例:

class C;

class A {
private:
    int data;
    friend class C; // 声明类C为类A的友元类
};

class C {
public:
    void callCAF(int x, A& a) {
        a.data = x;
        std::cout << a.data << std::endl;
    }
};

int main() {
    A a;
    C c;
    c.callCAF(3, a); // 输出:3
    return 0;
}

在上面的示例中,类C被声明为类A的友元类,因此类C可以访问类A的私有成员data。

注意:每个类都负责控制自己的友元类和友元函数,所以:
a)友元关系不能被继承,即基类(父类)的派生类(子类)不能被继承成友元函数
b)友元关系是单向的,比如上边类C是类A的友元类,但这并不表示类A同样是类C的友元类
c)友元关系没有传递性,比如类B是类A的友元类,类C是类B的友元类,这并不代表类C是类A的友元

友元成员函数

友元成员函数是**指一个类的成员函数被声明为另一个类的友元函数。意味着该成员函数可以访问另一个类的所有成员,包括私有成员。**下面是一个示例:

class A;

class C {
public:
    void callCAF(int x, A& a);
};

class A {
private:
    int data;
    friend void C::callCAF(int, A&); // 声明callCAF为类C的友元成员函数
};

void C::callCAF(int x, A& a) {
    a.data = x;
    std::cout << a.data << std::endl;
}

int main() {
    A a;
    C c;
    c.callCAF(3, a); // 输出:3
    return 0;
}

在上面的示例中,成员函数callCAF被声明为类C的友元成员函数,因此可以访问类A的私有成员data。

总结

友元在C++中提供了一种特殊的访问权限,允许函数或类访问另一个类的私有成员。友元函数、友元类和友元成员函数都提供了灵活性,但也破坏了类的封装性,降低了类的可靠性和可维护性。因此,在使用友元时需要谨慎考虑。

通过本篇博客,我们了解了友元函数、友元类和友元成员函数的用法,并提供了相应的示例代码。希望本文能够帮助读者更好地理解和应用友元在C++中的概念和用法。

你可能感兴趣的:(c++,算法,开发语言)