文章目录
- 条款 22:将成员变量声明为 private
- 核心思想
- 示例代码
- 注意事项
- 结论
条款 22:将成员变量声明为 private
核心思想
-
成员变量的封装性
将成员变量声明为private
是面向对象设计的重要原则,有助于保持封装性。 -
为何使用 private?
- 访问的一致性:通过提供公共接口(如 getter 和 setter),可以统一访问逻辑。
- 细致的访问控制:可以精确控制哪些操作允许客户执行,防止非法访问。
- 保证约束条件:通过接口,可以确保成员变量的值总是符合约束条件。
- 实现灵活性:可以随时修改内部实现,而无需更改外部接口。
-
避免使用 protected
protected
并不比public
更具封装性,因为派生类可以直接访问成员变量,破坏封装原则。
示例代码
class Person { public:// 构造函数Person(const std::string& name, int age) : name_(name), age_(age) {}// getter 和 setterconst std::string& getName() const { return name_; }void setName(const std::string& name){ name_ = name; }int getAge() const { return age_; }void setAge(int age) {if (age >= 0) age_ = age; // 确保年龄非负}private:std::string name_; // 姓名int age_; // 年龄 };
注意事项
-
不要使用 public 或 protected 成员变量
class Person { public:std::string name; // 不推荐:破坏封装int age; // 不推荐:外部可直接操作 };
- 问题:外界可以直接操作
name
和age
,导致对象可能进入非法状态。 - 改进:将成员变量设为
private
,并提供访问接口。
- 问题:外界可以直接操作
-
避免使用 protected 成员变量
class Base { protected:int data; // 不推荐:派生类可以直接访问 };
- 问题:派生类可直接操作
data
,破坏封装,增加错误风险。 - 改进:将成员变量设为
private
,派生类通过基类的公共接口访问。
- 问题:派生类可直接操作
结论
- 始终将成员变量声明为
private
,以保护封装性。 - 使用公共接口(getter 和 setter)控制成员变量的访问。
- 避免使用
protected
成员变量,因为它破坏封装原则。 - 通过良好的封装设计,可以提高代码的健壮性和可维护性。