关于MFC:CObject中的Dump()用法疑点

关于MFC::CObject中的Dump()用法疑问

#include "stdafx.h"

class CPerson :  public  CObject 
{
       DECLARE_DYNAMIC(CPerson)

private:
        CString _name;
public:
        CPerson(CString name)
                      :_name(name)
        {
         }

         virtual void Dump(CDumpCOntext&  dc)   const
        {
                  CObject::Dump(dc);
                  dc << (LPCTSTR)_name;
         }
};

IMPLEMENT_DYNAMIC(CPerson,CObject)

int _tmain()
{

 #if _DEBUG
      afx.Dump.SetDepth(1);
 #endif

      CWnd *pWnd = new CWnd();
      CPerson *pPerson = new CPerson(_T("bluejoe"));
      return    0;
}






诶嘛 累死了 手打的 咳咳 接下来 就是问题啦 
CPerson(CString name)
                      :_name(name)
这句是什么意思 求详细解释

virtual void Dump(CDumpCOntext&  dc)   const
        {
                  CObject::Dump(dc);
                  dc << (LPCTSTR)_name;
         }
中的 dc是什么标示符 是本身定义的还是干吗的  dc的作用是什么 在下面<<是起到什么作用。在CObject::Dump(dc);
中参数是起什么作用。

DECLARE_DYNAMIC(CPerson) 和IMPLEMENT_DYNAMIC(CPerson,CObject)
为什么左面的一个参数右面的两个 况且 他俩不是一个意思么。


  afx.Dump.SetDepth(1);
还有 怎么dump调用变成这样了 这句是啥意思。

没啦 求大手子 给讲讲 小子刚学 好多地方不懂  嘿嘿。

------解决方案--------------------
第一个是将构造函数的name参数传给_name变量。

顾名思义,dc就是dump context,所谓 context 就是上下文。
dump是一个接力的过程,先让自己的基类输出,然后自己输出。而自己的派生类会调用自己,这样可以保证全部内容都输出出来。

<<是输出流运算符,dump输出到流上,这样的好处是,它可以兼容显示器、文件、网络等等各种输出形式。

DECLARE_DYNAMIC这个是宏,具体看侯捷的深入浅出mfc的rtti部分。

SetDepth可以防止无限递归。比如说一个双向链表的节点对象,如果无限制转储,那么前一个节点输出后一个,后一个再输出前一个,那就没完了。