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: 0x1bfe430
B's this: 0x1bfe434
C's this: 0x1bfe430
注意在调bfoo时所传入的this指针的差异,因为C的对象在内存中数据布局是先放A的数据,再放B的数据,再放C本身的数据,所以访问B的成员时this指针须加上A数据的偏移。
|