C++ C++;嵌套类可访问性
给出以下代码,但不考虑两个类之间的友谊:C++ C++;嵌套类可访问性,c++,oop,C++,Oop,给出以下代码,但不考虑两个类之间的友谊: class OutSideClass { ... public: int i_pub; protected: int i_pro; private: int i_pri; class InSideClass { ... public: int j_pub; protected: int j_pro; p
class OutSideClass
{
...
public:
int i_pub;
protected:
int i_pro;
private:
int i_pri;
class InSideClass
{
...
public:
int j_pub;
protected:
int j_pro;
private:
int j_pri;
};
};
问题1>OutSideClass是否真的只能访问InSideClass的公共成员
问题2>InSideClass是否可以访问OutSideClass的所有成员
如果我的理解不正确,请更正。嵌套类对封闭类没有特殊访问权限 问题1>OutSideClass是否真的只能访问InSideClass的公共成员 对 问题2>InSideClass是否可以访问OutSideClass的所有成员 不,在C++03中。是的,在C++11中
标准文本对此非常清楚:
C++标准(2003)在$118/1[类.Access .Nest ]中表示,
嵌套类的成员对 封闭类,也不适用于已授予 对封闭班级的友谊;通行规则(第11条) 必须服从封闭类的成员没有特殊的 访问嵌套类的成员;通常的访问规则(第条) 11) 必须遵守。 然而,标准报价有一个缺陷。它表示嵌套类无权访问封闭类的私有成员。但是在C++11中,它被纠正了:在C++11中,嵌套类确实可以访问封闭类的私有成员(尽管封闭类仍然不能访问嵌套类的私有成员) 请参阅此缺陷报告:C++中所有嵌套类都将内部类放在外部类的命名空间中。要从OutSideClass的成员函数实例化InSideClass的实例,我只需要
InSideClass *instance = new InSideClass();
如果InsideClass是公共的,并且我想从不是OutSideClass成员的函数实例化InsideClass,我会键入:
OutSideClass::InSideClass *instance = new OutSideClass::InSideClass();
与Java等其他语言不同,InSideClass和OutSideClass在其他方面是完全独立的。As@Nawaz,在C++03中,嵌套类对封闭类的成员没有特殊的访问权限。但是,通过将嵌套类声明为友元,很容易绕过此限制
class OutSideClass
{
...
class InSideClass
{
...
};
friend class InSideClass;
};
根据你的答案,我的答案似乎是最新的C++标准。是(在C++0x标准中)。:-)哪一个是最新的?C++03或C++0x?@q0987:C++0x是最新版本。C++ 03是指C++语言在2003中的标准化。因此,C++0x最喜欢C++11,因为今年它将发布。正如其他地方提到的,对于C++11,这并不是他们所做的全部。嵌套类还被隐式授予
friend
对封闭类的访问权。这是从C++11开始编写的,但我认为在此之前,各种编译器都非正式地完成了这项工作。似乎当我这样做时,InSideClass无法通过名称引用OutSideClass的成员变量?@OrangeSherbet你能创建一个显示问题的实例吗?我知道你现在谈论的是C++03。我还看到问题只是关于访问。在任何情况下,我认为值得指出的是,嵌套的<代码> InnerClass < /> C++只能通过引用<代码>和<代码>访问一个非静态成员变量,该代码为<代码> OuterClass < /COD>的特定实例,这样我的NOBOS不会试图破坏C++的规则。