为什么类实例可以更改对象的私有值?

5
#include<iostream>
using namespace std;

class A
{
    private:
        int value;
    public:
        A(int init):value(init){}
        void changevalue(A &a){a.value = 100;}//why a's value can be changed?
        void printvalue(){cout << value << endl;}
};

int main(int argc , char *argv[])
{
    A a(2);
    A b(3);

    a.changevalue(b);
    b.printvalue();

    return 0;
}

aA类的一个实例,具有名为value的私有值,但为什么可以更改这个私有值?参数列表是否包含在类的范围内?


你在你的类中提供了那个接口。如果你不想让一个对象改变另一个对象,那么不提供接口就可以解决这个问题。但是,只有类本身才能访问私有内容,而不是实例。 - chris
2个回答

8
因为类访问修饰符是针对整个类而不是单个对象的。您可以在类函数中修改同一类型的对象。典型的例子包括复制构造函数和复制赋值运算符。

6

private 并不意味着“私有于对象身份”,而是“仅对类型(和友元)私有”。

需要注意的是,可访问性和能否写入到类型中是不同的概念。您始终可以访问自己类型对象内部的私有值,但能否写入取决于该对象是否声明为 const

void f(A& a){ a.value = 4; } // OK: 'a' is not 'const'
void g(A const& a){ a.value = 4 } // error: 'a' is marked as ' const'

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接