c++ this 指针详解

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


  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值