读书人

this指针的迷惑。解决方法

发布时间: 2012-05-24 11:55:41 作者: rapoo

this指针的迷惑。
子类A的成员函数调用父类B的一个方法。显示调用:B::fun(),fun方法里用到了this指针。请问,这个this指针是指向谁?


[解决办法]
子类A
[解决办法]

探讨

子类A

[解决办法]
关于this指针的一个经典回答:
  当你进入一个房子后,
  你可以看见桌子、椅子、地板等,
  但是房子你是看不到全貌了。
  对于一个类的实例来说,
  你可以看到它的成员函数、成员变量,
  但是实例本身呢?
  this是一个指针,它时时刻刻指向你这个实例本身
[解决办法]
探讨

那如果子类A的成员函数显示调用父类B的方法:B::fun(),而B类又调用C类的方法:funC(),funC()方法用到this指针,这个this指针是指向谁的了?A、B、C的关系是A继承B,B继承C。

[解决办法]
探讨

引用:
引用:

那如果子类A的成员函数显示调用父类B的方法:B::fun(),而B类又调用C类的方法:funC(),funC()方法用到this指针,这个this指针是指向谁的了?A、B、C的关系是A继承B,B继承C。

this表示自身的实例
朋友麻烦说的时候别一句话。单个类我明白。多个继承你说下原理?麻烦各位多指点下。别一句话就完事了,谢谢……

[解决办法]
派生类的指针可以转换成基类的指针.

当你使用一个基类的函数或数据成员时,发生这一个转换.


[解决办法]
this 就是本身
当前什么是什么对象this就是什么

this 默认的类型就是当前类本身的一个const指针

C/C++ code
CurClass *const this;
[解决办法]
子类继承父类也就是子类将父类的成员方法拷贝了一份到自己中,如果子类与父类有相同的方法的时候,用this指针调用的时候会调用子类的成员方法,如果子类与父类没有相同的方法的时候,那么this就会调用父类的那个方法:eg:
#include <iostream>
using namespace std;

//父类A
class A{
public:
void exportA{
cout<<"This is A"<<endl;
}

};
//子类B继承父类A
class B:public A{
public:
void exportB{
cout<<"This is B"<<endl;
}
};
int main()
{
B b;
b.exportB();
}
这个例子中子类B继承了父类A 那么子类B中的代码可以等效为:
class B{
public:
void exportA{
cout<<"This is A"<<endl;
}
void exportB{
cout<<"This is B"<<endl;
}

}这样就实现了代码的重用也就是继承的根本意义。那么this指向这个问题自然而然也就弄明白了:如果子类与父类有相同的方法的时候,用this指针调用的时候会调用子类的成员方法,如果子类与父类没有相同的方法的时候,那么this就会调用父类的那个方法。
[解决办法]
C/C++ code
#include <iostream>class Base{public:    void run()    {        this->what();    }    void what()    {        printf("I am Base\r\n");    }    virtual void vrun()    {        this->what();    }};class B: public Base{public:    void run()    {    this->what();    }    void what()    {        printf("I am B\r\n");    }    virtual void vrun()    {        this->what();    }};void run(Base *pa){    pa->run();//输出是I am Base。    pa->vrun();//输出是I am B。};void main(){    B b;    b.run();//输出是I am B。    run(&b);    system("pause");}
[解决办法]
就简单的单继承来说,指向子类。之所以在父类中可以正常使用,是因为父类数据在头部,继承类数据在其后。建议你看看那本经典的 《深入探索C++对象模型》
[解决办法]
探讨

ISO C++ 9.3.2措辞上(和Clause 5/Clause 12以及C99 TC等比起来)看来很业余,懒得抄了。
简单来说this的类型由所在作用域确定。

[解决办法]
太扯了。

编码的时候,脱离了类的实现this就不能用了,你在实现哪个类的成员函数的时候使用了this,this就代表这个类的一个对象的指针。




楼主的问题

this是在实现父类B的成员函数时候使用到的,所以当执行的时候this指针
从【型】上来说是代表父类的一个对象的指针
从【地址】上来说是指向子类A的一个实例的首地址!

如果还不明白建议楼主从C++类的对象的内存结构入手学习!
[解决办法]
换个角度来说,
this指针只有你在编码时候才会考虑到我用这个this代表谁

就像楼主的例子,既然你在实现类B的时候使用了this,你肯定很明白你在这里用this就是为了运行时来代表类B的一个对象的指针。

在实现类A的成员函数的时候你根本没有用到this指针,而只是间接的使用了B的一个成员函数,这个成员函数总使用了this,但是B使用的this在你实现A的时候跟你已经没有任何关系了!
你根本没必要去考虑B里面的this到底代表谁!
试想如果B不是你实现的,而是别人实现的,并且你看不到如何实现的只知道怎么使用,那你还会关心他里面的this代表谁么?
这个说的是【封装】


也可能楼主把this只当作一个了。
每个类都有自己的this,并且只限定于在这个类的成员函数的实现中。

[解决办法]

学习总结如下:
(1)派生类的指针可以转换成基类的指针.当你使用一个基类的函数或数据成员时,发生这一个转换.
【引用15楼】
(2)this是一个指针,它时时刻刻指向你这个实例本身。 【引用18楼】
(3)类是定义,类是属性,类不是具体存在的“物体”,而是“物体”所属的“类别”【引用31楼】
(4)写this,语义是调用虚函数。如果你不写成虚,那么就没有用。 【应用57楼】
(5)this指针只有你在编码时候才会考虑到我用这个this代表谁 【引用48楼】
其中(1)和(5)是统一的,讲的是一回事!!!!!!!!!!!!
(1)偏重于写程序(windows 程序)
(5) 偏重于读程序(MFC程序)
this指针自总结
(1)this是实例对象的指针,指向子类的首地址(在继承且含虚函数时可很好验证)
(2)编译器编译就近原则(36.38.48楼同)

读书人网 >C++

热点推荐