面试题答案
一键面试1. 访问修饰符的作用
- public:
- 被
public
修饰的成员(数据成员和成员函数)在类的外部可以直接访问。这意味着任何其他代码(例如在main
函数中或者其他类中)都能够使用这些成员。 - 它主要用于定义类的接口,使得外部代码能够与类进行交互。
- 被
- private:
private
修饰的成员只能在类的内部被访问,类的外部无法直接访问这些成员。- 这有助于隐藏类的内部实现细节,防止外部代码随意修改类的内部状态,提高了数据的安全性和类的封装性。
- protected:
protected
修饰的成员与private
类似,在类的内部可以访问。不同的是,在类的派生类(子类)中也可以访问这些成员,但在类的外部不能直接访问。- 它为类的继承提供了一种中间访问级别,使得基类能够将某些成员暴露给派生类,但对外部代码保持隐藏。
2. 对封装性的影响
- 封装性:封装是面向对象编程的重要特性,它将数据和操作数据的方法封装在一起,对外隐藏内部实现细节,只提供有限的接口供外部使用。
- public:通过提供
public
接口,使得外部代码可以与类进行交互,这是类与外界沟通的桥梁,但过多地暴露public
成员可能会破坏封装性,因为外部代码可以直接修改内部数据。 - private:
private
成员极大地增强了封装性,将类的内部数据和实现细节隐藏起来,外部代码无法直接访问和修改,只能通过类提供的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
成员函数setPrivateData
和getPrivateData
来访问和修改,体现了private
对数据的隐藏和封装。protectedData
在Example
类内部和其派生类Derived
中可以访问,而在类外部不能直接访问,展示了protected
在继承体系中的特性,同时也维护了一定的封装性。public
成员函数则为外部代码提供了与类交互的接口。