问题的背景:
封装是面向对象编程的一个关键原则,自C++出现以来即被引入。其理念是限制对对象内部状态的访问,只提供经过深思熟虑的接口供外部使用。在C++中,封装通过类成员的可见性范围来形式化:public,protected,private。
问题:
如果不使用封装,对象的内部状态可能会在程序的任何地方被修改,这会导致错误、难以追踪的bug以及整体可靠性的下降。然而,过度封闭可能会使类的维护和使用变得困难。
解决方案:
应明确区分类的接口(public部分)和实现(private/protected)。使用特殊方法(getter/setter)访问重要数据。对于复杂逻辑,通过附加类或模板进行机制分离。使用const方法以确保状态的不可变性。
代码示例:
class Counter { private: int value; public: Counter() : value(0) {} void increment() { ++value; } int get() const { return value; } };
主要特点:
是否可以直接在方法内部访问同一类的另一个对象的private成员?
可以,在类的方法内部可以访问同一类的其他对象的private成员。
class Example { int val; public: void copyVal(const Example& other) { val = other.val; } // 没有错误! };
友元函数是否可以访问类的private成员?
可以,友元函数对类的private/protected成员拥有完全访问权限。
构造函数可以为私有吗?这有什么用?
可以,私有构造函数常用于单例模式和工厂方法中以控制类实例的创建。
类BankAccount包含公开变量balance。任何外部代码都可以直接修改余额,导致错误,几乎无法调查。
优点:
缺点:
变量balance被隐藏,只有保护的方法来修改余额。检查是在类内部实现的。
优点:
缺点: