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;
}

aはvalueという名前のプライベート値を持つAクラスのインスタンスですが、なぜこのプライベート値を変更できるのでしょうか。それはクラスのスコープに含まれているパラメータリストですか?

4

2 に答える 2

8

クラスアクセス指定子は、オブジェクトごとではなく、クラスごとに適用されるためです。

クラス関数内で同じタイプのオブジェクトをいつでも変更できます。通常の例は、コピーコンストラクターとコピー代入演算子です。

于 2012-09-16T14:42:56.833 に答える
6

private「オブジェクトIDにプライベート」ではなく、「タイプ(および友人)にプライベート」を意味します。

アクセシビリティと型への書き込みができることは直交する概念であることに注意してください。独自のタイプのオブジェクト内のプライベート値にはいつでもアクセスできますが、それに書き込むことができるかどうかは、オブジェクトが次のように宣言されているかどうかによって異なります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'
于 2012-09-16T14:43:34.390 に答える