MST

星途 面试题库

面试题:C++ 中友元函数的使用规范

请详细阐述在 C++ 中友元函数的声明位置以及访问权限特点。举例说明如何定义一个友元函数来访问类的私有成员。
46.8万 热度难度
编程语言C++

知识考点

AI 面试

面试题答案

一键面试
  1. 友元函数声明位置

    • 友元函数可以在类定义内部声明。它不属于类的成员函数,声明时不需要加上 class 关键字限定其作用域。通常放在类定义的开头或结尾位置都可以,但为了代码的可读性,常放在类定义的开头部分。
  2. 访问权限特点

    • 友元函数打破了类的封装性。虽然类的私有成员和保护成员对于类外部的代码是不可访问的,但友元函数作为类的 “朋友”,可以访问该类的私有成员和保护成员。
    • 友元关系是单向的。即如果类 A 将函数 func 声明为友元,那么 func 可以访问 A 的私有和保护成员,但这并不意味着类 A 可以访问 func 所在作用域中的私有元素(如果 func 是某个类的成员函数,A 也不能直接访问该类的私有成员)。
    • 友元关系不能传递。若类 A 是类 B 的友元,类 B 是类 C 的友元,这并不意味着类 A 是类 C 的友元。
  3. 举例说明

#include <iostream>

class Rectangle {
private:
    int width;
    int height;
public:
    Rectangle(int w, int h) : width(w), height(h) {}
    // 声明友元函数
    friend int calculateArea(Rectangle rect);
};

// 定义友元函数
int calculateArea(Rectangle rect) {
    return rect.width * rect.height;
}

int main() {
    Rectangle rect(5, 3);
    std::cout << "The area of the rectangle is: " << calculateArea(rect) << std::endl;
    return 0;
}

在上述代码中,calculateArea 函数被声明为 Rectangle 类的友元函数,因此它可以访问 Rectangle 类的私有成员 widthheight 来计算矩形的面积。在 main 函数中创建了 Rectangle 对象并调用 calculateArea 函数来计算并输出矩形的面积。