C/C++——this指针

本文主要给读者介绍一下this指针,this指针是一种特殊的指针,理解this指针能更方便的开发程序,特别是在面向对象的可视化编程中,如MFC中会常常用到this指针,用好this指针能在程序开发中起到事半功倍的效果。

1.对象的存储机制

类实例化对象,同一类的对象的数据成员的值一般是不同的,但成员函数的操作是相同的,所以,类的所有对象有相同的成员函数入口,而不同对象的数据成员各自有各自的存储空间,也就是说对象所占的内存空间大小是由数据成员决定的。那么问题来了,既然公用的成员函数的入口地址相同,那么具体对象调用公用的成员函数的时候,函数怎么操作具体对象的数据成员,或者说,对象怎么把它自己的数据成员传递给公用的成员函数。

C++通过一种特殊的指针,this指针机制解决这个问题。

2.this指针

this指针指向当前的对象!一个类所有的对象调用的成员函数都是同一代码段。this指针是一个隐含于每一个成员函数中的特殊指针。它的值是当前调用这个公用成员函数的对象的地址,指向正在调用成员函数操作的对象,也就是操作成员函数的对象,在类的非静态成员函数中返回类对象本身的时候,直接使用return*this。例如,在对象pt调用成员函数时,成员函数如果有参数,除了接受实参外,还接受到了一个对象的地址。这个地址被一个隐含的形参this指针所获取,它等同于执行this=&pt。所有对数据成员的访问都隐含地被加上前缀this->。例如:x=0; 等价于 this->x=0。先看看下面的一个例子。

#include<iostream>

using namespace std;

class Sum

{

public:

    int add();

    int a;

    int b;

    int c;

};

int Sum::add()

{  return this->a +(*this).b+c;  }

 //分别用this指针、this去引用和直接三种方式访问类数据成员a, b,c

 

int main()

{

    Sum t;

    t.a = 1; t.b = 2; t.c = 3;

    cout << t.add() << endl;

    return 0;

}

上面显示的使用了this指针,通过上面的例子可以看出:this指针既可以被显示的使用,也可以被隐式的使用。隐式情况下,当一个对象调用成员函数时,编译程序先将对象的地址赋给this指针,然后调用成员函数,成员函数存取数据成员时,由隐含的this指针指向对象,取出相应的数据成员。而大多数程序设计中,通常都是隐式地使用this指针来访问数据成员。这些都是由编译器隐式完成的,程序员一般不关心。显示情况下,可以通过this->a和 (*this).a访问数据成员a,同样也可以使用*this来标识该对象。

 

this只能在成员函数中使用。全局函数、静态函数都不能使用this。调用系统非静态函数时,系统把对象的地址赋给this指针,由于静态成员函数不属于某一个对象,所以它没有this指针,所以不能对静态成员函数进行默认访问。同样,类的静态成员函数也就无法调用类的非静态数据成员和成员函数。

 

小技巧:在面向对象的编程中,一般会给程序开发提供庞大的类库,一个类中可能会有许多数据成员,如果在成员函数中想调用类中的某个成员,可以使用VC++提供的自动列出成员函数功能,使用this->,VC++将列出该类中的所有成员,我们可以从列表中选择我们想调用的成员。这样可以提高编写速度,减少拼写错误。

 

 

参考文献:

http://blog.chinaunix.net/uid-21411227-id-1826942.html

http://vvsongsunny.iteye.com/blog/1136136

 

 

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值