c++ this 指针详解

来源:互联网 发布:打开文件软件下载 编辑:程序博客网 时间:2024/05/22 03:04

this指针的概念

首先来观察一段代码:

class MyClass {int m_data;public:MyClass(int d = 0) : m_data(d) {}int data() const {return m_data;}};void tmyclass() {MyClass obj1;MyClass obj2(100);cout << obj1.data() << endl;cout << obj2.data() << endl;}

我们知道类的成员函数在内存只有一份拷贝,而类的数据成员(不考虑静态成员)是每个对象都有自己的一份,所以上述代码中obj1和obj2调用data函数是同一个函数,但它们拥有各自的数据,所以输出结果为0和100。

我这里要说明的问题是data()函数代码是一样的,都是返回m_data成员,为什么会输出不一样的结果呢?这就是this指针发挥的作用,其实在每个类的非静态成员函数中都隐藏了一个参数——this指针,这个指针指向对象本身,并且不能被修改,上述代码编译器其实是这样理解的:

class MyClass {int m_data;public:MyClass(const MyClass *const this, int d = 0) :this->m_data(d) {}int data(const MyClass *const this) const {return this->m_data;}};void tmyclass() {MyClass obj1(&obj1);MyClass obj2(&obj2, 100);cout << obj1.data(&obj1) << endl;cout << obj2.data(&obj2) << endl;}
这下理解this指针了吧?在语法上,这样写是编不过的,this作为c++的关键字,我们可以在非静态成员函数中直接使用,且非静态成员函数的第一个this指针参数隐藏不写,所以第一段代码是正确的写法,或者我们也可以在内部加上this指针写成这样:

class MyClass {int m_data;public:MyClass(int d = 0) {this->m_data = d;}int data() const {return this->m_data;}};void tmyclass() {MyClass obj1;MyClass obj2(100);cout << obj1.data() << endl;cout << obj2.data() << endl;}

其和第一段代码的效果是一样的。

多重继承中的this指针

由于多重继承中子类对象包含基类对象的数据,当通过子类对象指针调用基类中的方法时,所传入的this指针会有些不同,需要加一些偏移。我们来看这段代码:

#include <iostream>using namespace std;struct A {int a;void afoo() const {cout << "A's this: " << this << endl;}};struct B {int b;void bfoo() const {cout << "B's this: " << this << endl;}};struct C : A, B {int c;void cfoo() const {cout << "C's this: " << this << endl;}};int main() {C *c = new C;c->afoo();c->bfoo();c->cfoo();delete c;}
在我的64位平台上运行结果如下:

A's this: 0x1bfe430B's this: 0x1bfe434C's this: 0x1bfe430

注意在调bfoo时所传入的this指针的差异,因为C的对象在内存中数据布局是先放A的数据,再放B的数据,再放C本身的数据,所以访问B的成员时this指针须加上A数据的偏移。


0 0
原创粉丝点击