令人困惑的私人变量访问

时间:2014-07-28 06:50:00

标签: c++ private

一个实例的私有变量可以在其他实例的函数中使用。

以下代码正在打印5

#include <iostream>

class A
{
    public:
        A(int value) {
            x = value;
        }
        void printValue(A *obj) {
            std::cout << obj->x;
        }

    private:
        int x;
};

void main()
{
    A obj1(3);
    A obj2(5);

    obj1.printValue(&obj2);
    getchar();
    return;
}

任何人都可以解释为什么会这样。谢谢。

5 个答案:

答案 0 :(得分:3)

是的,它可以。每个类private:protected:限制,而不是每个实例。重要的是进行访问的代码所在的位置。如果访问private内容的代码位于同一个类中,或位于friend classfriend函数中,则允许访问。

答案 1 :(得分:2)

private的范围适用于该类型内的任何内容,而不仅适用于this个实例。

From MSDN:“在类成员列表之前,private关键字指定只能从成员函数和类的朋友访问这些成员。”

答案 2 :(得分:1)

让我们修改printValue

void printValue() 
{
    A *obj = this;
    std::cout << obj->x;
}

如果你说这不应该被编译,因为obj我们正在尝试访问其他对象的元素。如果这是成立的,那么甚至不能让任何类访问它自己的元素。复制/移动构造函数,(移动)赋值运算符将无法工作。

答案 3 :(得分:1)

这种行为不仅符合逻辑,而且非常有用。考虑

class Point2D {
  public:
    Point2D (int x, int y) : x(x), y(y);
    Point2D& operator+=(const Point2D& other) {
      x += other.x;
      y += other.y;
      return *this;
    }
  private:
    int x, y;
}

如果您无法访问other中的operator+=个私人会员,则您将被迫公开吸毒者和制定者以及{{1}的全部内容和x私人可能会失败。因此y隐藏了外部世界的成员,但不是来自同一个类的实例。

答案 4 :(得分:1)

是的,Obj1和Obj2都属于A类。因此,成员函数当然可以访问对象内的任何内容。为了更好地理解,您应该尝试理解成员函数如何实际操作它所调用的对象。

让我们举一个例子,再添加一个函数printValue()来解释更多:

#include <iostream>

class A
{
    public:
        A(int value) {
            x = value;
        }
        void printValue(A *obj) {
            std::cout << obj->x;
        }
        void printValue() {             // who supplies 'this' pointer accessible inside the function
            std::cout<< this->x;
        }

    private:
        int x;
};

void main()
{
    A obj1(3);
    A obj2(5);

    obj1.printValue(&obj2);
    getchar();
    return;
}

请注意我添加了一个成员函数void printValue();它使用this-&gt; x,即provided by the compiler和函数调用

obj1.printValue(&obj2)由编译器翻译为printvalue(this, &obj2)。 这就是为什么当你拨打我添加的obj1.printValue()时,它会被称为 printValue(this)其中this = &obj1由编译器提供。

如此有效的成员函数总是使用其指针访问对象。在您的情况下,有2个对象:1个您提供的对象和一个由编译器提供的对象。

我希望这能解释你的怀疑。