2010-02-18 38 views
3

如果一个新的类型声明whithin类,如:类中的类型声明的范围是什么?

class foo { 
public : 
    struct s1 { 
     int a ; 
    }; 
private : 
    struct s2 { 
     int b ; 
    }; 
}; 

那么在什么范围内可在下列语句中使用:提前

s1 ss1; 
s2 ss2; 

感谢。

+0

这是功课吗? – unwind 2010-02-18 13:04:52

+1

嗯,我放弃了在此引用标准。这是皮塔饼。 – 2010-02-18 14:22:52

回答

7

类型S1可以在任何地方使用,但如果使用的Foo的成员函数外,它必须是合格的:

foo::s1 ss1; 

类型s2只能用于foo的成员函数。

+0

Nitpick,从foo继承的类中不需要foo :: qualified。 – AProgrammer 2010-02-18 13:24:41

+1

...'s2'也可以在朋友函数或类中的'foo'方法之外使用合格的名称。有两个不相关的功能,需要使用范围限定符,并且可以使用不同访问级别(公共/受保护/专用)中的元素。 – 2010-02-18 13:28:16

+0

即使在成员函数之外,它也可以在课堂范围内无限制地使用。 – 2010-02-18 13:45:27

1

根据您的示例,两者都只能在类foo内使用。随着预选赛,不过,s1也可以外foo使用,像

foo::s1 ss1; 
1

有两个不同的问题:我可以在哪里使用不合格的短名称,以及哪里可以访问每种类型。

只要处于类范围内,就可以使用内部类型的非限定名称。这将在类声明中,并且在给定类或派生​​类的方法的定义中不隐藏名称(关于包含模板的层次结构中的依赖名称还有一些其他细节,但可能不在该范围之外的问题)。

第二个问题是您可以在哪里访问公共类和私人类的成员。你可以访问同一个类中的私有成员(包括类型),以及在类声明后被声明为该类的朋友的任何类或函数。在编译器看到该类的声明后,可以从任何地方访问公共成员。

1

嵌套类的范围限于封闭类。这两个类不能在foo之外访问。

但是,类s1 & s2之间存在差异。 您不能在foo之外创建s2的对象。

您可以使用Foo中的完全限定名称在foo外部创建s1的对象:s1 fs1; 继承Foo的类将能够访问s1,但不能访问s2。