类的方法中的本地类是这个类的朋友吗?

use*_*020 9 c++ class friend

我有一个外课A.它有一种方法A::fun.在此方法中,它具有本地或内部类B.我的问题是:是B朋友A吗?

我认为不是.这样对吗?如果是这样,我认为让B一个朋友的课程A非常有益,因为B可以访问A私人和受保护的成员.此外,由于B在方法中是本地的,因此其他人无法访问,因此作为朋友的安全A.如何解决B访问A私人和受保护成员的问题?

Pie*_*aud 14

不,他们不是朋友.

但是本地类对函数外部的名称具有与函数本身相同的访问权限.

标准说:

9.8本地类声明[class.local]

可以在函数定义中声明一个类; 这样的类叫做本地类.本地类的名​​称是其封闭范围的本地名称.本地类位于封闭范围的范围内,并且对函数外部的名称具有与封闭函数相同的访问权限.本地类中的声明不得使用(3.2)具有封闭范围的自动存储持续时间的变量.

计数的最大区别在于您的本地类只能在函数内部访问.

但在那之后:

  • 类的朋友是一个函数或类,它被授予使用类中的私有和受保护成员名称的权限.
  • 本地类位于封闭范围的范围内,并且对函数外部的名称具有与封闭函数相同的访问权限.也就是说,它可以访问函数所属类的受保护和私有成员.


Alo*_*ave 6

不,他们不是朋友.但这有关系吗?
并不是的!考虑这些事实:

  1. 在成员函数中,您始终可以访问该函数所属的类的成员.
  2. 您无法在函数之外的任何位置访问本地类.

所以如果他们是朋友也不重要.您总是会在其成员函数中引用外部类成员.

在线样本:

class A
{
    int i;
    void doSomething()
    {
        class B{public: int ii;};
        B obj;
        obj.ii = i;
    }
};

int main()
{
    return 0;
}
Run Code Online (Sandbox Code Playgroud)