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
- C++this指针详解
- C++this指针详解
- C++this 指针用法详解
- 详解C++中的this指针
- 【C/C++】this指针
- [C/C++] C++ this 指针详解 [ c++中文网 ]
- 详解this指针
- 详解c++ this 指针
- this 指针详解
- C++ This指针详解
- Javascript this指针详解
- this指针详解
- C++ this 指针详解
- c++ this 指针详解
- C++ this 指针详解
- C++ this指针详解
- C++ this指针详解
- this指针用法详解
- adb opendir failed ,permission denied
- Paste Deployment简介以及cinder-api-paste.ini的解析(1)
- UITableView学习心得
- J2EE——servlet
- 标签的使用
- c++ this 指针详解
- Balanced Binary Tree
- jython LookupError: unknown encoding 'ms936' 解决办法
- C++编译器与链接器工作原理
- ZeroMQ(java)之Requerst/Response模式
- spring jdbc mapper
- C语言涉及地址, 指针等符号的英语读法,有助于语法理解
- ZeroMQ(java)之Publish/Subscribe模式
- 跳槽风波的感悟