MST

星途 面试题库

面试题:C++友元函数访问非公有成员的注意事项

假设有一个类`MyClass`,其中包含非公有成员函数`privateFunc`。现在需要定义一个友元函数`friendFunc`来访问`privateFunc`,请写出完整代码,并阐述友元函数在访问非公有成员时的作用域特点以及可能带来的问题。
33.6万 热度难度
编程语言C++

知识考点

AI 面试

面试题答案

一键面试
#include <iostream>

class MyClass {
private:
    void privateFunc() {
        std::cout << "This is a private function." << std::endl;
    }
    friend void friendFunc(MyClass& obj);
};

void friendFunc(MyClass& obj) {
    obj.privateFunc();
}

int main() {
    MyClass obj;
    friendFunc(obj);
    return 0;
}

友元函数在访问非公有成员时的作用域特点

  1. 不受类成员访问控制限制:友元函数不属于类的成员函数,但可以访问类的私有和保护成员。它就像被授予了特殊权限,可以直接调用类的非公有成员函数或访问非公有数据成员,这打破了类的封装性。
  2. 没有this指针:因为不是类的成员函数,所以友元函数没有隐含的this指针。在访问类的成员时,需要显式地通过类对象来调用成员函数或访问数据成员。

可能带来的问题

  1. 破坏封装性:封装是面向对象编程的重要特性,它将数据和操作封装在类内部,隐藏实现细节。友元函数的使用破坏了这种封装,使得外部函数可以直接访问类的非公有成员,增加了程序的耦合度。如果类的内部实现发生变化,可能会影响到友元函数,反之亦然。
  2. 降低安全性:由于友元函数可以访问类的非公有成员,一旦友元函数被恶意使用(例如在错误的地方调用、误操作等),可能会导致类的数据遭到破坏,从而影响程序的稳定性和可靠性。
  3. 代码维护困难:友元函数的存在使得类与外部函数之间的关系变得复杂。在维护代码时,不仅需要考虑类本身的逻辑,还需要考虑友元函数对类非公有成员的依赖和影响,增加了代码理解和维护的难度。