访问控制是面向对象编程的基本原则,确保类的内部数据的封装和保护。
问题背景:
经典C++支持三种访问修饰符:public、protected和private。这一理念旨在保护类的内部实现,并将接口与实现分开。
问题:
没有正确的访问控制,类的用户可能会无意中修改对象的内部状态或破坏类的不变性。设计不良的访问会增加代码的维护和扩展难度。
解决方案:
使用修饰符来清晰地划分外部世界可以使用的内容和仅供对象内部使用的内容。
代码示例:
class Sample { private: int secret; protected: void setSecret(int s) { secret = s; } public: Sample(int s) : secret(s) {} int getSecret() const { return secret; } };
关键特性:
protected成员(但不能访问private成员)。friend函数或friend类可以访问另一个类的私有成员吗?
可以,friend关键字提供对类的私有和受保护成员的完全访问。这样的做法需要谨慎使用,以免破坏封装。
示例:
class PrivData { private: int secret; friend void accessSecret(const PrivData& d); }; void accessSecret(const PrivData& d) { std::cout << d.secret; }
如果知道私有成员的名称,能否通过指针或类型转换访问它?
可以,通过类型转换或内存操作(例如“指向成员的指针技巧”),但这违反了语言标准并导致未定义行为。这样做是不可取的。
在继承中会发生什么:父类的私有成员能否被子类访问?
不能,私有成员无法直接被派生类访问,仅能通过基类的public/protected访问器方法访问。
负面案例
在一个大项目中,所有类成员都被声明为public,以快速原型设计。
优点:
缺点:
正面案例
所有内容都严格按访问级别划分,仅在单元测试中使用friend函数。
优点:
缺点: