如果一个新的类型声明whithin类,如:类中的类型声明的范围是什么?
class foo {
public :
struct s1 {
int a ;
};
private :
struct s2 {
int b ;
};
};
那么在什么范围内可在下列语句中使用:提前
s1 ss1;
s2 ss2;
感谢。
如果一个新的类型声明whithin类,如:类中的类型声明的范围是什么?
class foo {
public :
struct s1 {
int a ;
};
private :
struct s2 {
int b ;
};
};
那么在什么范围内可在下列语句中使用:提前
s1 ss1;
s2 ss2;
感谢。
类型S1可以在任何地方使用,但如果使用的Foo的成员函数外,它必须是合格的:
foo::s1 ss1;
类型s2只能用于foo的成员函数。
Nitpick,从foo继承的类中不需要foo :: qualified。 – AProgrammer 2010-02-18 13:24:41
...'s2'也可以在朋友函数或类中的'foo'方法之外使用合格的名称。有两个不相关的功能,需要使用范围限定符,并且可以使用不同访问级别(公共/受保护/专用)中的元素。 – 2010-02-18 13:28:16
即使在成员函数之外,它也可以在课堂范围内无限制地使用。 – 2010-02-18 13:45:27
根据您的示例,两者都只能在类foo
内使用。随着预选赛,不过,s1
也可以外foo
使用,像
foo::s1 ss1;
有两个不同的问题:我可以在哪里使用不合格的短名称,以及哪里可以访问每种类型。
只要处于类范围内,就可以使用内部类型的非限定名称。这将在类声明中,并且在给定类或派生类的方法的定义中不隐藏名称(关于包含模板的层次结构中的依赖名称还有一些其他细节,但可能不在该范围之外的问题)。
第二个问题是您可以在哪里访问公共类和私人类的成员。你可以访问同一个类中的私有成员(包括类型),以及在类声明后被声明为该类的朋友的任何类或函数。在编译器看到该类的声明后,可以从任何地方访问公共成员。
嵌套类的范围限于封闭类。这两个类不能在foo之外访问。
但是,类s1 & s2之间存在差异。 您不能在foo之外创建s2的对象。
您可以使用Foo中的完全限定名称在foo外部创建s1的对象:s1 fs1; 继承Foo的类将能够访问s1,但不能访问s2。
这是功课吗? – unwind 2010-02-18 13:04:52
嗯,我放弃了在此引用标准。这是皮塔饼。 – 2010-02-18 14:22:52