读书人

嵌套种与外围类的私有成员

发布时间: 2012-12-20 09:53:21 作者: rapoo

嵌套类与外围类的私有成员
嵌套类以外围类对象为自己的私有数据成员,难道就能通过这个对象去访问外围类对象的私有成员?

#include <iostream>

class test
{
public:
class item;
private:
int i;
test():i(10) {}
void f()
{
std::cout<<i+1<<std::endl;
}
};
class test::item
{
test a;
public:
void print()
{
std::cout<<a.i<<std::endl;//能访问私有成员?
a.f(); //同上
}
};
int main()
{
test::item b;
b.print();
return 0;
}

[最优解释]
item是test的一部分,就跟test的成员函数访问私有变量差不多。
[其他解释]
引用:
首先这里并没有声明友类。按你们说的,但显然不是因为item是嵌套类所以相当于友元,又是否是因为嵌套类中用了外围类的对象作为子对象,才有此状况?
可不可以这样说:若一个类用另一个类对象作为子对象,那么这个类就是子对象所在类的友类?


其实,类的基本概念理解了,就行了。这个属于类最基本的概念(类的成员函数可以访问private变量)里的。
只是初看起来有点陌生罢了。
[其他解释]
差点被搞晕了。
当然可以。有点和有元差不多。但item要通过test来访问。
[其他解释]
同意楼上,相当于友类了吧。
[其他解释]
首先这里并没有声明友类。按你们说的,但显然不是因为item是嵌套类所以相当于友元,又是否是因为嵌套类中用了外围类的对象作为子对象,才有此状况?
可不可以这样说:若一个类用另一个类对象作为子对象,那么这个类就是子对象所在类的友类?
[其他解释]
要友元声明,以及预先类声明
class Ar1;//可以放到Ar2可见的任何地方
class Ar2
{
friend class Ar1;
class Ar1
{
};
};
这样
[其他解释]
嗯,明白了谢谢大家
[其他解释]
帮楼主总结一下:

好好查了一些资料,也敲了一边代码。
总结来自:http://xingfinal.blog.163.com/blog/static/9792456820104875055927/
这里讲了访问的控制。

其实嵌套类和外围类基本是两个互不相干的类。但是有些访问还是要注意的。
1. 嵌套类的只对外围类可见。
就是说用嵌套类的话,就要用外围类去限定。
2. 外围类访问不到嵌套类的私有成员。
3. 嵌套类可以通过外围类的对象、指针或引用访问外围类的所有成员。
为什么要通过类的对象、指针或引用呢?因为一般的成员需要实例化才会真正的实体本身的。
4. 嵌套类可以直接访问外围类的静态成员,类型名,枚举值。
为什么会可以直接访问呢,因为静态成员,类型名,枚举值不属于任何对象的实例化。
5. 因为这两个类不怎么相干,所以他们的sizeof得到的值也互不相干。

说到底,应该是一种实现机制吧,或者实现规定吧。
可以去查查嵌套类的作用或目的。

读书人网 >C++

热点推荐