MST

星途 面试题库

面试题:C++中类外访问非公有成员的常规手段及潜在风险

在C++中,通常有哪些方式可以在类外访问非公有成员?请详细说明每种方式,并阐述每种方式可能带来的安全风险。
36.9万 热度难度
编程语言C++

知识考点

AI 面试

面试题答案

一键面试
  1. 友元函数(Friend Function)
    • 说明:在类的定义中,通过friend关键字声明某个函数为该类的友元函数,友元函数可以访问该类的非公有成员。例如:
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;
}
  • 安全风险:破坏了类的封装性,使得原本不应该被随意访问的非公有成员可以被友元函数访问。如果友元函数被滥用,可能导致数据的非法修改或泄露,因为友元函数可以直接操作类的非公有成员,而不受类本身访问控制的严格限制。
  1. 友元类(Friend Class)
    • 说明:通过friend关键字声明某个类为该类的友元类,友元类的所有成员函数都可以访问该类的非公有成员。例如:
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 in FriendClass: " << obj.privateData << std::endl;
    }
};
  • 安全风险:同样严重破坏了类的封装性,友元类的所有成员函数都能随意访问非公有成员。这意味着如果友元类的代码不受严格控制,其中任何一个成员函数都可能对被友元类的非公有成员进行不当操作,导致数据完整性受损或安全漏洞。
  1. 使用成员函数作为中介(间接访问)
    • 说明:在类中定义公有成员函数,这些函数可以访问并操作非公有成员,然后在类外通过调用这些公有成员函数来间接访问非公有成员。例如:
class MyClass {
private:
    int privateData;
public:
    MyClass(int data) : privateData(data) {}
    int getPrivateData() const {
        return privateData;
    }
};

int main() {
    MyClass obj(10);
    int data = obj.getPrivateData();
    return 0;
}
  • 安全风险:相对友元函数和友元类,这种方式较为安全,但如果公有成员函数的实现存在漏洞,例如对输入参数验证不严格,可能会被恶意利用来间接修改或获取非公有成员数据,导致潜在的安全问题。不过,只要公有成员函数的实现合理且安全,就可以在一定程度上保证类的封装性和数据安全。