如何在C ++中限制对象私有数据成员修改?

时间:2016-06-14 11:14:56

标签: c++ oop private members

请检查以下代码,我需要一个解决方案来限制A类私人数据成员的修改。请建议。

class A{
private:
    int a;
    int b;

public:
    A(int i=0, int j=0):a(i),b(j){
        cout<<"A's constructor runs"<<endl;
    }
    void showVal(){
        cout<<"a: "<<a<<" b: "<<b<<endl;
    }
};

int main(){
    A ob1(10,20);
    ob1.showVal();

    int *ptr = (int*)&ob1;
    *(ptr+0)=1;
    *(ptr+1)=2;

    ob1.showVal();

    return 0;
}

2 个答案:

答案 0 :(得分:2)

你无法阻止某人翘曲&#39;这样的指针。您无法阻止您的private数据被故意或恶意修改,只会被您的班级用户意外修改。

除非您设法将数据存储到只读内存中......您可以从操作系统获取一些内存,将数据放入其中,然后让操作系统将内存标记为只读 - 并且只有这样才能发布&#39;指向数据的指针。当然,您无法修改数据......

答案 1 :(得分:0)

您的代码示例不是关于私有数据成员的修改,而是关于通过恶意指针对对象的直接损坏。我不认为在C ++中有一种实用的方法来防止疯狂或邪恶的程序员这样做。

private旨在保护理智的客户不会意外地破坏对象的内部状态。那些不想玩得很好的人无论如何都可以做#define private public

我想起Herb Sutter引用的一句话,这与一个不同的主题有关但我认为它很好地解决了你的问题:

  

请记住,我们关注的是保护墨菲,而不是马基雅维利 - 防止错误和错误,而不是故意犯罪 - 这种病态滥用属于后一类。