假设您有以下 UML 类图:
类型的变量可以Mystery
调用函数DoSomething()
吗?
我知道一个对象(比如说Mystery X;
)可以调用GetA()
来访问私有变量int a
并访问int b
您所需要的公共变量,X.b
但是如果可能的话,这个对象如何X
访问私有函数DoSomething()
呢?
假设您有以下 UML 类图:
类型的变量可以Mystery
调用函数DoSomething()
吗?
我知道一个对象(比如说Mystery X;
)可以调用GetA()
来访问私有变量int a
并访问int b
您所需要的公共变量,X.b
但是如果可能的话,这个对象如何X
访问私有函数DoSomething()
呢?
我很难理解你在问什么,但我想我已经弄清楚了。
如果您要问是否,请给出以下声明:
class Mystery
{
/*...*/
private:
void DoSomething();
};
你可以这样做:
Mystery m;
m.DoSomething();
……那么答案是否定的。您不能从类的上下文之外调用private
成员函数(或引用成员变量)。private
只有另一个成员函数Mystery
可以调用private
s。例如:
void Mystery::Foo()
{
DoSomething(); // this would be possible if Foo() is a member of Mystery
}
编辑:
不仅不能调用private
类外的成员,也不能调用子类的成员。例如,这是无效的:
class Base
{
private:
void Foo() {};
};
class Child : public Base
{
public:
void Bar()
{
Foo(); // ERROR: Can't call private method of base class
}
};
有一个(编辑-为了完整起见,不止一个,请参阅评论)可以在您的类之外调用私有成员函数的奇怪方式,但它需要一些人为的示例,您可以在其中返回一个指向此函数的指针:
class Mystery;
typedef void (Mystery::*fptr)();
class Mystery{
void DoSomething() {};
public:
static fptr GetPrivateDoSomething()
{
return &DoSomething;
}
};
int main(int argc, char *argv[])
{
Mystery m;
fptr ds = Mystery::GetPrivateDoSomething();
(m.*ds)();
return 0;
}
话虽如此,不要这样做。私有方法之所以是私有的,是有原因的——它们体现了设计的隐藏方面,并且从未打算成为公开接口的一部分。这意味着他们可能会改变行为,甚至完全删除。此外,做这些恶作剧会导致代码高度耦合和尴尬,这是不可取的。
话虽这么说,我确实使用过它并且效果很好,尽管它是在一个完全不同的环境中帮助减少耦合(如果你想知道的话,它是在一个高度模块化的事件注册方案中)。
类中的任何方法都可以访问私有变量和方法。它的工作方式与调用任何其他方法完全一样,只是如果您尝试从类外部执行此操作,编译器会给您一个错误。