zoukankan      html  css  js  c++  java
  • C++中的this指针

    一个对象的成员函数其实就是一般的全局函数,只是编译器给它隐含加了一个指向该对象的const指针,这就是this指针。下面让我们一起来了解一下this指针吧!


    this 指针是一个隐含于每一个类的成员函数中的特殊指针(包括析构函数和构造函数),它用于指向正在被成员函数操作的对象。不过,在一般的程序设计中不直接用它的,this是一个指针变量,因此在成员函数中,可以使用*this来表示正在调用该函数的对象。

    1. this指针的用处:

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

    例如,调用date.SetMonth(9) <===> SetMonth(&date, 9),this帮助完成了这一转换 .

    2. this指针的使用:

    一种情况就是,在类的非静态成员函数中返回类对象本身的时候,直接使用 return *this;另外一种情况是当参数与成员变量名相同时,如this->n = n (不能写成n = n)。

    3. this指针程序示例:

    this指针存在于类的成员函数中,指向被调用函数所在的类实例的地址。

    根据以下程序来说明this指针

    1. #include<iostream.h>   
    2. class Point   
    3. {   
    4. int x, y;   
    5. public:   
    6. Point(int a, int b) { x=a; y=b;}   
    7. void MovePoint( int a, int b){ x+=a; y+=b;}   
    8. void print(){ cout<<"x="<<x<<"y="<<y<<endl;}  
    9. };   
    10. void main( )   
    11. {   
    12. Point point1( 10,10);   
    13. point1.MovePoint(2,2);   
    14. point1.print( );   
    15. }  

    当对象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调用该函数后,也就是point1的数据成员被调用并更新了值。

    即该函数过程可写成 point1.x+= a; point1. y + = b; 

    4. 关于this指针的一个经典回答:

    当你进入一个房子后,

    你可以看见桌子、椅子、地板等,

    但是房子你是看不到全貌了。

    对于一个类的实例来说,

    你可以看到它的成员函数、成员变量,

    但是实例本身呢?

    this是一个指针,它时时刻刻指向你这个实例本身

    通过上面的分析,我们可以了解到,this就是自己,自己就是this,每个对象都有一个指向自己的this指针,就因为这个this指针,才使得有不同的实例,要不一个类岂不是就像一个实例了??


    原文地址:http://developer.51cto.com/art/201104/254741.htm


  • 相关阅读:
    149. Max Points on a Line(js)
    148. Sort List(js)
    147. Insertion Sort List(js)
    146. LRU Cache(js)
    145. Binary Tree Postorder Traversal(js)
    144. Binary Tree Preorder Traversal(js)
    143. Reorder List(js)
    142. Linked List Cycle II(js)
    141. Linked List Cycle(js)
    140. Word Break II(js)
  • 原文地址:https://www.cnblogs.com/java20130726/p/3218459.html
Copyright © 2011-2022 走看看