MST

星途 面试题库

面试题:C++ 中友元关系如何影响类的封装性

请阐述在 C++ 里,友元函数和友元类是怎样打破类的封装性的?举例说明友元函数和友元类的定义方式以及它们对类成员访问权限的改变。
13.9万 热度难度
编程语言C++

知识考点

AI 面试

面试题答案

一键面试

1. 友元函数和友元类打破封装性的原理

  • 封装性是指将数据和操作数据的方法绑定在一起,并隐藏对象的内部实现细节,只对外提供有限的接口。
  • 友元函数和友元类打破封装性在于它们能够访问类的私有和保护成员,而这些成员通常是类的内部实现细节,对外是隐藏的。通过授予友元这种特殊的访问权限,使得外部函数或类可以绕过类的访问控制机制直接访问这些私有和保护成员,从而打破了封装。

2. 友元函数定义方式及对访问权限的改变

友元函数是在类定义中使用 friend 关键字声明的非成员函数,它可以访问该类的私有和保护成员。

#include <iostream>

class MyClass {
private:
    int privateData;
public:
    MyClass(int data) : privateData(data) {}
    // 声明友元函数
    friend void printPrivateData(MyClass obj); 
};

// 友元函数的定义
void printPrivateData(MyClass obj) {
    std::cout << "Private data: " << obj.privateData << std::endl;
}

int main() {
    MyClass myObj(10);
    printPrivateData(myObj);
    return 0;
}

在上述代码中,printPrivateData 函数被声明为 MyClass 的友元函数,因此它可以直接访问 MyClass 的私有成员 privateData

3. 友元类定义方式及对访问权限的改变

友元类是在一个类中使用 friend 关键字声明另一个类,声明为友元类的所有成员函数都可以访问该类的私有和保护成员。

#include <iostream>

class FriendClass; // 前向声明

class MyClass {
private:
    int privateData;
public:
    MyClass(int data) : privateData(data) {}
    // 声明友元类
    friend class FriendClass; 
};

class FriendClass {
public:
    void accessPrivateData(MyClass obj) {
        std::cout << "Private data from FriendClass: " << obj.privateData << std::endl;
    }
};

int main() {
    MyClass myObj(20);
    FriendClass friendObj;
    friendObj.accessPrivateData(myObj);
    return 0;
}

在上述代码中,FriendClass 被声明为 MyClass 的友元类,所以 FriendClass 的成员函数 accessPrivateData 可以访问 MyClass 的私有成员 privateData