一个实例的私有变量可以在其他实例的函数中使用。
以下代码正在打印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;
}
任何人都可以解释为什么会这样。谢谢。
答案 0 :(得分:3)
是的,它可以。每个类private:
和protected:
限制,而不是每个实例。重要的是进行访问的代码所在的位置。如果访问private
内容的代码位于同一个类中,或位于friend class
或friend
函数中,则允许访问。
答案 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个您提供的对象和一个由编译器提供的对象。
我希望这能解释你的怀疑。