MST
星途 面试题库

面试题:C++中友元函数与友元类的特性及简单应用

请简述C++友元函数和友元类的特性。假设你有一个包含私有成员变量的类`A`,编写代码实现一个友元函数来访问`A`的私有成员变量,并说明友元函数在实际项目中的常见应用场景。
25.9万 热度难度
编程语言C++

知识考点

AI 面试

面试题答案

一键面试

友元函数和友元类的特性

  1. 友元函数
    • 友元函数不是类的成员函数,但它可以访问类的私有和保护成员。
    • 友元函数的声明需在类定义中使用friend关键字。
    • 它不受类的访问控制符限制,可以在类的任何位置声明。
  2. 友元类
    • 若一个类B被声明为另一个类A的友元类,那么类B的所有成员函数都可以访问类A的私有和保护成员。
    • 友元关系是单向的,若BA的友元类,并不意味着AB的友元类。
    • 友元关系不能传递,若BA的友元类,CB的友元类,并不意味着CA的友元类。

代码示例

#include <iostream>

class A {
private:
    int privateVariable;
public:
    A(int value) : privateVariable(value) {}
    // 声明友元函数
    friend void accessPrivate(A& obj);
};

// 友元函数定义
void accessPrivate(A& obj) {
    std::cout << "The private variable value is: " << obj.privateVariable << std::endl;
}

int main() {
    A a(10);
    accessPrivate(a);
    return 0;
}

常见应用场景

  1. 运算符重载:当运算符的左操作数不是该类的对象时,可能需要使用友元函数来实现运算符重载。例如,实现ostream& operator<<(ostream& os, const ClassName& obj)来支持自定义类的输出操作。
  2. 辅助类:某些辅助类需要频繁访问另一个类的私有成员,将辅助类声明为友元类可以方便地实现这种访问。例如,一个用于调试的类可能需要访问被调试类的私有状态。
  3. 数据结构关联:在一些复杂的数据结构中,不同的数据结构类可能需要相互访问对方的私有成员,通过友元关系可以实现这种紧密的交互。