c++ this 指针详解

论坛 期权论坛 脚本     
匿名技术用户   2021-1-6 04:29   262   0

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数据的偏移。


分享到 :
0 人收藏
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

积分:7942463
帖子:1588486
精华:0
期权论坛 期权论坛
发布
内容

下载期权论坛手机APP