如果在类中声明了新类型,例如:
class foo {
public :
struct s1 {
int a ;
};
private :
struct s2 {
int b ;
};
};
然后在以下陈述的范围内使用:
s1 ss1;
s2 ss2;
提前致谢。
答案 0 :(得分:7)
类型s1可以在任何地方使用,但如果在foo的成员函数之外使用,它必须是合格的:
foo::s1 ss1;
类型s2只能用于foo的成员函数。
答案 1 :(得分:1)
根据您的示例,两者都只能在类foo
中使用。但是,使用限定符时,s1
也可以在foo
之外使用,例如
foo::s1 ss1;
答案 2 :(得分:1)
有两个不同的问题:我可以在哪里使用不合格的短名称,以及我可以访问每种类型的地方。
只要您在类范围内,就可以使用内部类型的非限定名称。这将在类声明中,并且在给定类或派生类的方法的定义中不隐藏名称(在涉及模板的层次结构中有关于依赖名称的一些其他细节,但这可能超出了范围问题)。
第二个问题是您可以访问班级的公共成员和私人成员。您可以在声明类之后访问同一个类以及声明为该类的朋友的任何类或函数中的私有成员(包括类型)。在编译器看到类的声明后,可以从任何地方访问公共成员。
答案 3 :(得分:1)
嵌套类的范围仅限于封闭类。这两个类不能在foo之外访问。
然而,类s1和&之间存在差异。 S2。 你不能在foo之外创建s2的对象。
您可以使用Foo中的完全限定名称在foo外创建s1的对象:s1 fs1; 继承Foo的类将能够访问s1,但不能访问s2。