可以从外部访问私人运营商吗

Can a private operator be accessible from outside?

本文关键字:运营商 访问 从外部      更新时间:2023-10-16

即,如果我在私有部分的类中定义运算符==和+,它们可以从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添加友元声明(甚至不知道这是否可能),答案是否定的,所以您显然发现了编译器错误。