You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C++中不通过对象本身是否可以修改类对象的私有成员变量?

结论

你描述的行为确实属于违反类封装原则的情况,问题根源是类的接口设计存在漏洞,主动泄露了私有成员的可写访问权限。

你给出的示例代码如下:

class text{
public:
    text(int c):
    _c(c)
    {}
    int& operator[](int position){
        return _c;
    }
private:
    int _c;
};


int main(){
    text t = text(5);
    std::cout<< t[0] << std::endl;
    int* p = &t[0];
    *p = 10;
    std::cout<< t[0] << std::endl;
    return 0;
}

具体原因分析

  • 封装的核心逻辑是将类的内部状态隐藏在私有作用域中,所有对内部状态的读写都必须经过类暴露的受控公共接口,类可以在这些接口中实现参数校验、状态同步、资源管理等统一逻辑。
  • 上述示例中的operator[]返回了私有成员_c的非常量左值引用,外部代码拿到这个引用后,既可以直接通过引用修改值,也可以取地址得到指针后随意修改,全程不需要经过类的任何其他接口,相当于把原本应该受保护的私有成员完全暴露给了外部,private修饰符在这里相当于完全失效。

《Effective C++:改善程序与设计的55个具体做法》条款28明确指出:避免返回句柄(handle,包括引用、指针、迭代器)指向对象内部成分。返回非常量内部句柄的行为,会直接破坏类的封装性,即使相关成员本身被声明为private也无法避免。

改进方案

如果你的operator[]只需要提供读权限,可以将返回值修改为const int&或者直接返回int值,这样外部就无法通过返回值修改内部成员;如果确实需要开放修改权限,就要明确接受“该成员的修改不受类接口控制”的代价,放弃对这个成员的封装保护。

内容的提问来源于stack exchange,提问作者anes47

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.29 02:45:00