是类的方法中的局部类,是该类的朋友
Is a local class in a method of a class a friend of this class?
我有一个外部类A
。它有一个方法A::fun
。在这个方法中,它有一个局部类或内部类B
。我的问题是:B
是A
的朋友吗?
我认为不是。对吗?如果是这样的话,我认为让B
类成为A
的朋友是非常有益的,因为B
可以访问A
的私有和受保护成员。此外,由于B
在方法中是本地的,因此其他人无法访问它,因此作为A
的朋友是安全的。如何让B
访问A
的私有和受保护成员?
但是局部类对函数外部名称的访问权限与函数本身的访问权限相同。
标准上写着:
9.8本地类声明[class.Local]
类可以在函数定义中声明;这样的类被称为局部类。局部类的名称是其封闭作用域的局部名称本地类在封闭作用域的作用域中,并且与封闭函数一样可以访问函数外的名称局部类中的声明不应使用(3.2)来自封闭范围的具有自动存储持续时间的变量。
最大的区别在于,您的本地类只能在函数内部访问。
但在那之后:
- 类的友元是一个函数或类,它被授予使用该类的私有和受保护成员名的权限
- 本地类在封闭作用域的作用域中,并且与封闭函数一样可以访问函数外的名称。也就是说,它可以访问函数所属类的受保护成员和私有成员
不是真的!考虑以下事实:
- 在成员函数中,您将始终可以访问该函数所属类的成员
- 不能在函数之外的任何位置访问本地类
所以他们是不是朋友并不重要。您将总是在其成员函数中引用外部类成员。
在线样本:
class A
{
int i;
void doSomething()
{
class B{public: int ii;};
B obj;
obj.ii = i;
}
};
int main()
{
return 0;
}
这在Clang:中编译
class A {
typedef int Int;
void fn();
};
void A::fn() {
class B {
Int i;
};
}
内部类可以访问A的私人成员,但不是因为它是朋友,而是因为它被视为成员。由于类的成员可以访问私有成员,这包括内部类以及成员函数的本地类。
参见[class.access]p2。
相关文章:
- 为不同配置设置MSVC_RUNTIME_LIBRARY的正确方法是什么
- 通过方法访问结构
- 最小硬币更换问题(自上而下方法)
- C++为构建时间获取QDateTime的可靠方法
- 在C#中处理C++指针而不使用unsafe的最佳方法
- 处理多个异常集合的C++方法
- 如果C++类在类方法中具有动态分配,但没有构造函数/析构函数或任何非静态成员,那么它仍然是POD类型吗
- C++详细介绍命名空间 vs 匿名 vs 私有方法到类 vs. pimpl vs. 朋友类
- 如何从C 的朋友类访问私有静态方法
- 如何在模板中编写朋友(操作员)方法
- 在模板类中编写朋友函数声明的正确方法是什么?
- C++11 纯虚拟类的朋友无法访问私有方法
- 使用VCPKG与朋友共享您的项目的最佳方法是什么?
- C++静态朋友方法示例(需要澄清)
- 朋友调用虚拟私有方法-应该发生什么
- 我可以在Visual Studio 2012中将方法声明为朋友吗?
- 是类的方法中的局部类,是该类的朋友
- 最Vexing的朋友?朋友化一个专门的免费函数模板会引发编译错误(当重载一个方法时)
- 以朋友的身份制作课堂方法
- 这里有比朋友课更好的方法吗