有如下代码int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct )
{
   if(CMDIFrameWnd::OnCreate(lpCreateStruct) == -1 )
      return -1;
   if(!m_wndToolBar.Create(this) ||   // 显式和隐式的this是同一个吗?
      !m_wndToolBar.LoadToolBar(IDR_MAINFRAME) )
   //...
}
1)C++类的成员函数有个隐式的this指针,像上面那样显式使用this,这个this是指m_wndToolBar对象的地址还是CMainFrame对象的地址?
2)是不是还有个隐式的this指针和这个显式的不一样?

解决方案 »

  1.   

    1. 在哪个类中,this指针就是属于谁得
    2. 人家说得隐式是指在调用OnCreate时不需要在lpCreateStruct中指明this。你这里得看到得Create(this)这个this不是什么所谓得“显式”this指针,进入Create之后,this变为m_wndToolBar对象得指针,和你这里看到得this毫无关系也就是说:this指针进入不同参数,其值时不断变化得,它特指“当前函数所属类的当前实例的指针”
      

  2.   


    this不就是指CMainFrame对象的指针 什么时候变成m_wndToolBar对象的了???
      

  3.   

    进入Create之后,this变为m_wndToolBar对象得指针也就是说:this指针进入不同参数,其值时不断变化得,它特指“当前函数所属类的当前实例的指针”当前函数不是CMainFrame类吗??  可别告诉我this还会动态变的啊!!
      

  4.   

    看,有不同意见的人来了,到底是哪个的才对呢?那个this到底指向谁啊?
      

  5.   

    我们说“进入Create之后”,进入Create时,当前函数就是Create,这个Create是m_wndToolbarWnd的,怎么“当前函数不是CMainFrame类吗?”this指针当然是个动态变的概念,他是随着调用上下文不停变化的,进入哪个类的函数,就变成哪个类的指针。如果不变,他怎么还能是“当前对象的指针”呢?
      

  6.   

    你自己的判断力呢?难道C++教科书上没有this的定义?即使别人有争议,你也不能光等人有了共识啊?假如我后楼上就没有共识了,你难道就永远不知道答案?
      

  7.   

    感觉楼上的不少人错误理解了。进入Create之后,this变为m_wndToolBar对象得指针也就是说:this指针进入不同参数,其值时不断变化得,它特指“当前函数所属类的当前实例的指针”当前函数不是CMainFrame类吗?? 可别告诉我this还会动态变的啊!!
    ============
    他所说的,不是指在CMainFrame中的this指针变了,而是指,如果进入了Create之后,你再写this,这个this就指的是m_wndToolBar了,并不是说CMainFrame中的那个this变成了m_wndToolBar.
      

  8.   

    其实人家的解释已经很清楚了,this指向谁要看你在什么地方用的。
    比如,你下面这段代码:
    CMyDialog::OnOK()
    {
     ...你在这里引用this,this就是指向一CMyDialog的对象。
    }
    CMainFrame::OnXXX()
    {
    在这里引用this,就是指向一CMainFrame对象。
    }
    总之,this到底指向什么是根据你引用它的位置决定的。
      

  9.   

    楼主问偏了。
    this指针永远都是本身隐含的,表示指向自己的指针。
    没有什么隐式、显式之说。12楼才是正解。
      

  10.   

    谢谢12楼为我详细描述:一个例子说明吧:
    class CFoo1;
    class CFoo2
    {
       public:
         void test(CFoo1 * p1);
    };
    class CFoo1
    {
       public:
         void test1()
         {
             CFoo2 foo2;
             foo2.test(this);//这里的this指的是CFoo1的一个实例
                                //进入foo2.test后,this就指得是foo2
         };
    };void CFoo2::test(CFoo1 * p) //注意:你这里不可能使用“this”,尽管上面调用时指定的时this
    {
        printf("%p\n", this);// 这里又是一个this,这个this和前面哪个this毫无关系
                                //它代表的时CFoo2的一个实例,也就是前面test1函数内的变量foo2
    }
      

  11.   

    this是当前类的指针,进入某个类的成员函数,this就是该类的指针。
      

  12.   

    看错了,分数打反了,不好意思啊arong~!