C++ 面试题 目录

C++ 中什么是友元函数 (friend function) 和友元类 (friend class)?

推荐答案

在C++中,友元函数(friend function)和友元类(friend class)是用于访问类的私有(private)和保护(protected)成员的特殊机制。

友元函数

友元函数是一个非成员函数,但它可以访问类的私有和保护成员。友元函数在类中声明时使用 friend 关键字。友元函数可以是全局函数,也可以是其他类的成员函数。

-- -------------------- ---- -------
----- ------- -
--------
    --- ------------

-------
    ----------- ----- - ----------------- --

    -- ------
    ------ ---- ------------------------ -------- -----
--

-- ------
---- ------------------------ -------- ---- -
    --------- -- -------- ----- - -- --------------- -- ----------
-

友元类

友元类是一个类,它可以访问另一个类的私有和保护成员。友元类在类中声明时使用 friend 关键字。

-- -------------------- ---- -------
----- ------- -
--------
    --- ------------

-------
    ----------- ----- - ----------------- --

    -- -----
    ------ ----- ------------
--

----- ----------- -
-------
    ---- ------------------------ -------- ---- -
        --------- -- -------- ----- - -- --------------- -- ----------
    -
--

本题详细解读

友元函数的作用

友元函数的主要作用是允许外部函数访问类的私有和保护成员,而不需要通过类的公有接口。这在某些情况下可以提高代码的灵活性,尤其是在需要频繁访问类的私有成员时。

友元类的作用

友元类的作用与友元函数类似,但它允许整个类访问另一个类的私有和保护成员。这在两个类之间有紧密合作关系时非常有用,例如在实现某些设计模式时。

注意事项

  1. 封装性:友元机制破坏了类的封装性,因此应谨慎使用。只有在确实需要访问私有成员时才使用友元。
  2. 单向性:友元关系是单向的。如果类A是类B的友元,类B并不自动成为类A的友元。
  3. 继承:友元关系不会被继承。如果类A是类B的友元,类A的子类并不会自动成为类B的友元。

示例代码解释

在示例代码中,displayPrivateData 函数被声明为 MyClass 的友元函数,因此它可以访问 MyClass 的私有成员 privateData。同样,FriendClass 被声明为 MyClass 的友元类,因此 FriendClass 的所有成员函数都可以访问 MyClass 的私有成员。

通过这种方式,友元函数和友元类提供了一种灵活的方式来访问类的私有成员,同时保持了代码的清晰性和可维护性。

纠错
反馈