MST

星途 面试题库

面试题:C++中类访问控制如何实现基本的封装性

请阐述C++中public、private和protected访问修饰符在类中的作用,以及它们是如何影响类的封装性的。以一个简单的包含数据成员和成员函数的类为例进行说明。
13.4万 热度难度
编程语言C++

知识考点

AI 面试

面试题答案

一键面试

1. 访问修饰符的作用

  • public
    • public修饰的成员(数据成员和成员函数)在类的外部可以直接访问。这意味着任何其他代码(例如在main函数中或者其他类中)都能够使用这些成员。
    • 它主要用于定义类的接口,使得外部代码能够与类进行交互。
  • private
    • private修饰的成员只能在类的内部被访问,类的外部无法直接访问这些成员。
    • 这有助于隐藏类的内部实现细节,防止外部代码随意修改类的内部状态,提高了数据的安全性和类的封装性。
  • protected
    • protected修饰的成员与private类似,在类的内部可以访问。不同的是,在类的派生类(子类)中也可以访问这些成员,但在类的外部不能直接访问。
    • 它为类的继承提供了一种中间访问级别,使得基类能够将某些成员暴露给派生类,但对外部代码保持隐藏。

2. 对封装性的影响

  • 封装性:封装是面向对象编程的重要特性,它将数据和操作数据的方法封装在一起,对外隐藏内部实现细节,只提供有限的接口供外部使用。
  • public:通过提供public接口,使得外部代码可以与类进行交互,这是类与外界沟通的桥梁,但过多地暴露public成员可能会破坏封装性,因为外部代码可以直接修改内部数据。
  • privateprivate成员极大地增强了封装性,将类的内部数据和实现细节隐藏起来,外部代码无法直接访问和修改,只能通过类提供的public成员函数来间接操作private数据,从而保证了数据的完整性和安全性。
  • protected:在继承体系中,protected成员有助于在保持一定封装性的同时,让派生类能够访问基类的某些成员,使得派生类可以基于基类的内部状态进行扩展和定制,而不会将这些成员暴露给外部代码。

3. 示例代码

#include <iostream>

class Example {
private:
    int privateData; // 私有数据成员,只能在类内部访问
protected:
    int protectedData; // 受保护数据成员,类内部和派生类中可访问
public:
    Example() : privateData(0), protectedData(0) {}

    void setPrivateData(int value) {
        privateData = value; // 公有成员函数,用于设置私有数据
    }

    int getPrivateData() {
        return privateData; // 公有成员函数,用于获取私有数据
    }

    void setProtectedData(int value) {
        protectedData = value; // 公有成员函数,用于设置受保护数据
    }

    int getProtectedData() {
        return protectedData; // 公有成员函数,用于获取受保护数据
    }
};

class Derived : public Example {
public:
    void modifyProtectedData() {
        protectedData = 10; // 派生类中可以访问基类的protected成员
    }
};

int main() {
    Example ex;
    ex.setPrivateData(5);
    std::cout << "Private data: " << ex.getPrivateData() << std::endl;

    ex.setProtectedData(7);
    std::cout << "Protected data: " << ex.getProtectedData() << std::endl;

    // 以下操作会报错,因为privateData在类外部不可访问
    // ex.privateData = 10; 

    Derived derived;
    derived.modifyProtectedData();
    std::cout << "Derived's modified protected data: " << derived.getProtectedData() << std::endl;

    return 0;
}

在上述代码中,privateData只能通过Example类的public成员函数setPrivateDatagetPrivateData来访问和修改,体现了private对数据的隐藏和封装。protectedDataExample类内部和其派生类Derived中可以访问,而在类外部不能直接访问,展示了protected在继承体系中的特性,同时也维护了一定的封装性。public成员函数则为外部代码提供了与类交互的接口。