C++ 嵌套类
2016-01-13 16:07
543 查看
http://www.cppblog.com/aaxron/archive/2013/04/22/199634.html
#include "stdafx.h"
/*
c++嵌套类
可以在另一个类内部定义一个类,这样的类嵌套类(nested class)
嵌套类是独立的类,基本上与它们外围类不相关,因此,外围类和嵌套类的对象是互相独立的。
嵌套类型的对象不具备外围类所定义的成员,同样,外围类的成员也不具备嵌套类所定义的成员。
在一个类的内部定义另一个类,我们称之为嵌套类(nested class),或者嵌套类型。之所以引入这样一个嵌套类,往往是因为外围类需要使用嵌套类对象作为底层实现,并且该嵌套类只用于外围类的实现,且同时可以对用户隐藏该底层实现。
虽然嵌套类在外围类内部定义,但它是一个独立的类,基本上与外围类不相关。它的成员不属于外围类,同样,外围类的成员也不属于该嵌套类。嵌套类的出现只是告诉外围类有一个这样的类型成员供外围类使用。并且,外围类对嵌套类成员的访问没有任何特权,嵌套类对外围类成员的访问也同样如此,它们都遵循普通类所具有的标号访问控制。
若不在嵌套类内部定义其成员,则其定义只能写到与外围类相同的作用域中,且要用外围类进行限定,不能把定义写在外围类中。例如,嵌套类的静态成员就是这样的一个例子。
前面说过,之所以使用嵌套类的另一个原因是达到底层实现隐藏的目的。为了实现这种目的,我们需要在另一个头文件中定义该嵌套类,而只在外围类中前向声明这个嵌套类即可。当然,在外围类外面定义这个嵌套类时,应该使用外围类进行限定。使用时,只需要在外围类的实现文件中包含这个头文件即可。
另外,嵌套类可以直接引用外围类的静态成员、类型名和枚举成员(假定这些成员是公有的)。类型名是一个typedef名字、枚举类型名、或是一个类名。
在嵌套类的定义被看到之前我们只能声明嵌套类的指针和引用,如上面在A中定义为B m_b而不是B* m_b将会引发一个编译错误。
关于C++嵌套类的详细用法请参考《C++ Primer 第三版》P551。
*/
//outerB.h
//外围类outerB
class outerB
{
public:
outerB();
~outerB();
void show();
//嵌套类 innerA
class innerA
{
public:
innerA();
~innerA();
void _show();
};
private:
innerA* m_p_innerA;
};
//outerB.cpp
outerB::outerB():m_p_innerA(new innerA)
{
printf("%s \r\n",__FUNCTION__);
}
outerB::~outerB()
{
printf("%s \r\n",__FUNCTION__);
if (m_p_innerA!=NULL)
{
delete m_p_innerA;
}
}
void outerB::show()
{
m_p_innerA->_show();
printf("%s \r\n",__FUNCTION__);
}
outerB::innerA::innerA()
{
printf("%s \r\n",__FUNCTION__);
}
outerB::innerA::~innerA()
{
printf("%s \r\n",__FUNCTION__);
}
void outerB::innerA::_show()
{
printf("%s \r\n",__FUNCTION__);
}
int _tmain(int argc, _TCHAR* argv[])
{
outerB x;
x.show();
return 0;
}
//输出
/*
outerB::innerA::innerA
outerB::outerB
outerB::innerA::_show
outerB::show
outerB::~outerB
outerB::innerA::~innerA
*/
#include "stdafx.h"
/*
c++嵌套类
可以在另一个类内部定义一个类,这样的类嵌套类(nested class)
嵌套类是独立的类,基本上与它们外围类不相关,因此,外围类和嵌套类的对象是互相独立的。
嵌套类型的对象不具备外围类所定义的成员,同样,外围类的成员也不具备嵌套类所定义的成员。
在一个类的内部定义另一个类,我们称之为嵌套类(nested class),或者嵌套类型。之所以引入这样一个嵌套类,往往是因为外围类需要使用嵌套类对象作为底层实现,并且该嵌套类只用于外围类的实现,且同时可以对用户隐藏该底层实现。
虽然嵌套类在外围类内部定义,但它是一个独立的类,基本上与外围类不相关。它的成员不属于外围类,同样,外围类的成员也不属于该嵌套类。嵌套类的出现只是告诉外围类有一个这样的类型成员供外围类使用。并且,外围类对嵌套类成员的访问没有任何特权,嵌套类对外围类成员的访问也同样如此,它们都遵循普通类所具有的标号访问控制。
若不在嵌套类内部定义其成员,则其定义只能写到与外围类相同的作用域中,且要用外围类进行限定,不能把定义写在外围类中。例如,嵌套类的静态成员就是这样的一个例子。
前面说过,之所以使用嵌套类的另一个原因是达到底层实现隐藏的目的。为了实现这种目的,我们需要在另一个头文件中定义该嵌套类,而只在外围类中前向声明这个嵌套类即可。当然,在外围类外面定义这个嵌套类时,应该使用外围类进行限定。使用时,只需要在外围类的实现文件中包含这个头文件即可。
另外,嵌套类可以直接引用外围类的静态成员、类型名和枚举成员(假定这些成员是公有的)。类型名是一个typedef名字、枚举类型名、或是一个类名。
在嵌套类的定义被看到之前我们只能声明嵌套类的指针和引用,如上面在A中定义为B m_b而不是B* m_b将会引发一个编译错误。
关于C++嵌套类的详细用法请参考《C++ Primer 第三版》P551。
*/
//outerB.h
//外围类outerB
class outerB
{
public:
outerB();
~outerB();
void show();
//嵌套类 innerA
class innerA
{
public:
innerA();
~innerA();
void _show();
};
private:
innerA* m_p_innerA;
};
//outerB.cpp
outerB::outerB():m_p_innerA(new innerA)
{
printf("%s \r\n",__FUNCTION__);
}
outerB::~outerB()
{
printf("%s \r\n",__FUNCTION__);
if (m_p_innerA!=NULL)
{
delete m_p_innerA;
}
}
void outerB::show()
{
m_p_innerA->_show();
printf("%s \r\n",__FUNCTION__);
}
outerB::innerA::innerA()
{
printf("%s \r\n",__FUNCTION__);
}
outerB::innerA::~innerA()
{
printf("%s \r\n",__FUNCTION__);
}
void outerB::innerA::_show()
{
printf("%s \r\n",__FUNCTION__);
}
int _tmain(int argc, _TCHAR* argv[])
{
outerB x;
x.show();
return 0;
}
//输出
/*
outerB::innerA::innerA
outerB::outerB
outerB::innerA::_show
outerB::show
outerB::~outerB
outerB::innerA::~innerA
*/
相关文章推荐
- C语言通过逻辑运算(与或非)实现加法
- C++学习之对象数组篇
- C风格字符串与C++风格字符串
- 也谈C++中char*与wchar_t*之间的转换
- 单链表结点删除 C语言实现
- TinyXML:一个优秀的C++ XML解析器
- 重学C++ (五) 函数
- Google C++命名规范
- C语言贪心算法,关于零钱取整问题
- 【C语言提高52】链表的基本操作
- c/c++笔记
- C/C++ void及void指针
- C、C++动态分配函数暨几种参数传递疑难解析
- C++中的 virtual destructor
- C++中的虚函数表
- C++ Primer Plus 学习笔记(三)--编程练习6
- c++内存分配(new和delete)
- C++中的多态与虚函数的内部实现
- LevelDB windows vs2013 c++编译和测试
- 【C语言提高51】链表基本概念与静态链表