浅析this指针

来源:互联网 发布:js代码混淆 编辑:程序博客网 时间:2024/05/29 11:11

 1、this指针的含义及其用法:

     在每一个成员函数中都包含一个特殊的指针,这个指针的名字是固定的,称为this,它是指向本类对象的一个指针,它的值是当前被调用的成员函数所在的对象的起始地址。

     一个对象的this指针并不是对象本身的一部分,不会影响sizeof(对象)的结果。this作用域是在类内部,当在类的非静态成员函数中访问类的非静态成员的时候,编译器会自动将对象本身的地址作为一个隐含参数传递给函数。也就是说,即使你没有写上this指针,编译器在编译的时候也是会加上的,它作为非静态成员函数的隐含形参,对各成员的访问均通过this进行。

    this指针记录每个对象的内存地址,然后通过运算符->访问该对象的成员。 因为this并不是一个常规变量,所以不能取得this的地址。

2、this指针的程序实例:

#include <iostream> using namespace std;   class A { public:     int get() const{return i;}     void set(int x){this->i=x;cout<<"this指针保存的内存地址为:"<<this<<endl;} private:     int i; };   int main() {     A a;     a.set(9);     cout<<"对象a所在的内存地址为:"<<&a<<endl;     cout<<"对象a所保存的值为:"<<a.get()<<endl;     cout<<endl;     A b;     b.set(999);     cout<<"对象b所在的内存地址为:"<<&b<<endl;     cout<<"对象b所保存的值为:"<<b.get()<<endl;     return 0; }

上面这个程序的输出结果表明,this指针变量记录的是当前对象的内存地址,即this指针指向当前的对象。 

#include <iostream>  class Point   {   int x, y;   public:   Point(int a, int b) { x=a; y=b;}   void MovePoint( int a, int b){ x+=a; y+=b;}   void print(){ cout<<"x="<  };   void main( )   {   Point point1( 10,10);   point1.MovePoint(2,2);   point1.print( );      }  }


上面这个程序表明,当对象point1调用MovePoint(2,2)函数时,即将point1对象的地址传递给了this指针。  

MovePoint函数的原型应该是 void MovePoint( Point *this, int a, int b);第一个参数是指向该类对象的一个指针,我们在定义成员函数时没看见是因为这个参数在类中是隐含的。这样point1的地址传递给了this,所以在MovePoint函数中便显式的写成:void MovePoint(int a, int b) { this->x +=a; this-> y+= b;} 可以知道,point1调用该函数后,它的数据成员被调用并更新了值。

3、关于this指针的一些注意点:

    在C++类和结构只有一个区别:类的成员默认是private,而结构是publicthis是类的指针,如果换成结构,那this就是结构的指针了。

    this指针是隐式的,是编译系统自动实现的,不可以显示的在形参中添加this指针,可以在成员函数内显示的使用this指针。

    并不是所有的成员函数都有this指针,比如构造函数,静态成员函数就没有this指针。因为构造函数只在创建对象的时候调用一次,静态成员函数是属于类的不属于对象,所以没有this指针。

 


 

0 0
原创粉丝点击