可以从外部访问私人运营商吗
Can a private operator be accessible from outside?
即,如果我在私有部分的类中定义运算符==和+,它们可以从main访问吗?
它适用于MSVS2008和2010,但对我来说,它似乎是编译器中的一个错误。是这样吗?
在私有访问说明符下声明的函数或成员将无法在类成员函数之外访问。
C++中的类/结构/联合有3个访问说明符。这些访问说明符定义了如何访问类的成员。当然,一个类的任何成员都可以在该类中访问(在同一类的任意成员函数中)。继续讨论访问说明符的类型,它们是:
Public
-声明为Public的成员可以通过类的对象从类外部访问
受保护-声明为受保护的成员可以从类外部访问,但只能在派生自类的类中访问。
Private-这些成员只能从类中访问。不允许外部访问。
朋友们来营救
在另一个类内将函数声明为friend允许该函数访问类内的所有成员函数,而不考虑访问说明符规则friend这是一种绕过C++中制定的访问说明符规则的方法。类似地,在另一个类中声明为friend的类将允许被声明为friends的类访问该类的所有成员。请注意,好友声明可以在任何访问规范下给出,它将具有相同的效果。
源代码示例:
class MyClass
{
public:
int a;
protected:
int b;
private:
int c;
friend void doSomething(MyClass obj);
};
void doSomething(MyClass obj)
{
obj.a = 10; //Allowed
obj.b = 20; //Allowed,
obj.c = 30; //Allowed,
}
int main()
{
MyClass obj;
obj.a = 10; //Allowed
obj.b = 20; //Not Allowed, gives compiler error
obj.c = 30; //Not Allowed, gives compiler error
}
因此,在您的使用中,如果您使用friend
,那么您可以访问该类的私有成员,否则您的编译器有问题,您应该考虑更改它
您必须显示代码,才能合理地解释编译器接受它的原因。我猜您是将它们作为friend
自由函数来实现的。无论如何,为了论证起见,假设你有:
class bar {
friend bool operator==( bar const &, bar const & ) {
return true;
}
bar operator+( bar const & ) {
return *this;
}
};
int main() {
bar a, b;
a == b; // ok
//a + b; // nok: operator+ is private from this context
}
现在是解释。在本例中,operator+
被声明为私有部分内的成员函数,因此,访问说明符适用,除非main
是类的朋友,否则它将无法访问它。另一方面,operator==
被实现为自由函数(即使定义是在类大括号内提供的),访问说明符不适用于此。
该代码几乎等同于(在查找方面有一点不同):
class bar {
friend bool operator==( bar const &, bar const & ); // just declare as friend
//...
};
bool operator==( bar const &, bar const & ) {
return true;
}
其中,从主函数推断operator==
的可访问性要简单得多。
是的,这是一个bug。它们只能由朋友函数和朋友类访问。所有其他人都不应该访问私人区域。
第一个答案是:否。如果它可以从外部访问,那么成为private
有什么意义?
然而,有一个转折点。
如果您使main()
成为类的朋友,则只能从main()
访问它。所以第二个答案是:这实际上取决于:只有成员函数和朋友才能访问类的private
成员。
class A
{
int data; //private
friend int main(); //make main() friend of A
};
int main()
{
A a;
a.data = 100; //okay - main() is a friend of class A
}
void f()
{
A a;
a.data = 100; //error - f() is not a friend of class A
}
这意味着,我推断operator==
和operator+
一定是代码中类的朋友。
如果您还没有为main添加友元声明(甚至不知道这是否可能),答案是否定的,所以您显然发现了编译器错误。
- 呼叫运营商<<临时
- 两个运营商的一些奇怪的冲突<<
- 如何在 CPP 中访问家长的运营商
- 如何明确调用好友流运营商
- 私有运营商删除会触发 GCC 和 Clang 的编译时错误,但不会在 MSVC 上触发编译时错误
- 使用运营商New分配的数据结构是否有任何副作用
- "Inheriting"移动运营商?
- 朋友ostream&运营商<<无法访问私人会员
- 为什么在下面的代码返回类型中是用于运营商重载的类类型
- 范围的枚举(枚举类)关系运营商
- 为什么“操作员”需要const但不是为“运营商&lt;”
- 对这两个分配运营商之间的不同感到困惑
- 我的班级意外加法运营商
- OpenACC - C++"新"运营商问题
- c 对运营商的一致性是新的,有多少重要
- 朋友超载的派生类和基本成员访问的运营商
- 已删除的构造函数/运营商的可访问性至关重要
- 运营商&lt;&lt;无法访问班级的私人int
- C++:可以向私人运营商"passing through"朋友类授予访问权限吗?
- 可以从外部访问私人运营商吗