C++ 访问修饰符
外观
C++访问修饰符[编辑 | 编辑源代码]
访问修饰符(Access Modifiers)是C++面向对象编程中控制类成员(属性和方法)可见性的关键机制。它们定义了类成员在类外部及其他类中的可访问范围,是实现封装性这一OOP核心特性的重要工具。
访问修饰符类型[编辑 | 编辑源代码]
C++提供三种访问修饰符:
修饰符 | 作用域 | 可访问性 |
---|---|---|
public |
公有 | 类内、派生类、类外均可访问 |
private |
私有 | 仅类内和友元可访问(默认修饰符) |
protected |
保护 | 类内和派生类可访问 |
访问范围示意图[编辑 | 编辑源代码]
详细说明[编辑 | 编辑源代码]
public(公有成员)[编辑 | 编辑源代码]
公有成员构成类的接口,允许在任何上下文中访问。
#include <iostream>
using namespace std;
class Circle {
public:
double radius;
double getArea() {
return 3.14159 * radius * radius;
}
};
int main() {
Circle c;
c.radius = 5.0; // 直接访问public成员
cout << "Area: " << c.getArea(); // 输出: Area: 78.5397
return 0;
}
private(私有成员)[编辑 | 编辑源代码]
私有成员实现数据隐藏,只能通过类的公有方法访问。
class BankAccount {
private:
double balance; // 封装敏感数据
public:
void deposit(double amount) {
if (amount > 0) balance += amount;
}
double getBalance() { return balance; }
};
int main() {
BankAccount acc;
// acc.balance = 1000; // 错误:private成员不可直接访问
acc.deposit(500);
cout << acc.getBalance(); // 正确:通过公有方法访问
}
protected(保护成员)[编辑 | 编辑源代码]
保护成员在继承体系中可见,但对类外不可见。
class Vehicle {
protected:
string fuelType;
};
class Car : public Vehicle {
public:
void setFuel(string type) {
fuelType = type; // 派生类可访问protected成员
}
};
int main() {
Car myCar;
// myCar.fuelType = "Gasoline"; // 错误:类外不可访问
myCar.setFuel("Diesel"); // 通过派生类方法修改
}
实际应用案例[编辑 | 编辑源代码]
用户认证系统的典型实现:
class User {
private:
string hashedPassword; // 敏感数据私有化
protected:
int accessLevel; // 子类需要但外部不应直接修改
public:
string username;
bool verifyPassword(string input) {
return hash(input) == hashedPassword;
}
};
class Admin : public User {
public:
Admin() { accessLevel = 3; } // 派生类设置保护成员
};
特殊注意事项[编辑 | 编辑源代码]
- 类默认访问权限:class默认为private,struct默认为public
- 友元例外:friend声明可以突破访问限制
- 继承类型影响:
* 公有继承:基类访问权限不变 * 保护继承:基类public→protected * 私有继承:所有基类成员→private
最佳实践[编辑 | 编辑源代码]
1. 遵循最小暴露原则:默认使用private,仅暴露必要接口 2. 保护成员谨慎使用:仅当确定需要被继承时使用 3. 数据成员通常设为private,通过getter/setter控制访问 4. 保持接口(public方法)稳定,内部实现(private)可自由修改
数学表示[编辑 | 编辑源代码]
访问控制可以形式化为可见性函数:
其中:
- = 类成员
- = 访问上下文
- = 派生类检查
- = 同类检查