c++的this指针

谁借莪1个温暖的怀抱¢ 2022-09-17 15:20 316阅读 0赞

C++中this指针的用法.

  1. this指针只能在一个类的成员函数中调用,它表示当前对象的地址。下面是一个例子:
  2. void Date::setMonth( int mn )
  3. {
  4. month = mn; // 这三句是等价的
  5. this->month = mn;
  6. (*this).month = mn;
  7. }
  8. 1. this只能在成员函数中使用。
  9. 全局函数,静态函数都不能使用this
  10. 实际上,成员函数默认第一个参数为T* const register this
  11. 如:
  12. class A{
  13. public: int func(int p){}};
  14. 其中,func的原型在编译器看来应该是: int func(A* const register this, int p);
  15. 2. 由此可见,this在成员函数的开始前构造的,在成员的结束后清除。
  16. 这个生命周期同任一个函数的参数是一样的,没有任何区别。
  17. 当调用一个类的成员函数时,编译器将类的指针作为函数的this参数传递进去。如:
  18. A a;
  19. a.func(10);
  20. 此处,编译器将会编译成: A::func(&a, 10);
  21. 嗯,看起来和静态函数没差别,对吗?不过,区别还是有的。编译器通常会对this指针做一些优化的,因此,this指针的传递效率比较高--如vc通常是通过ecx寄存器来传递this参数。
  22. 3. 回答
  23. #1:this指针是什么时候创建的?
  24. this在成员函数的开始执行前构造的,在成员的执行结束后清除。
  25. #2:this指针存放在何处? 堆,栈,全局变量,还是其他?
  26. this指针会因编译器不同,而放置的位置不同。可能是栈,也可能是寄存器,甚至全局变量。
  27. #3:this指针如何传递给类中函数的?绑定?还是在函数参数的首参数就是this指针.那么this指针又是如何找到类实例后函数的?
  28. this是通过函数参数的首参数来传递的。this指针是在调用之前生成的。类实例后的函数,没有这个说法。类在实例化时,只分配类中的变量空间,并没有为函数分配空间。自从类的函数定义完成后,它就在那儿,不会跑的。
  29. #4:this指针如何访问类中变量的/?
  30. 如果不是类,而是结构的话,那么,如何通过结构指针来访问结构中的变量呢?如果你明白这一点的话,那就很好理解这个问题了。
  31. C++中,类和结构是只有一个区别的:类的成员默认是private,而结构是public
  32. this是类的指针,如果换成结构,那this就是结构的指针了。
  33. #5:我们只有获得一个对象后,才能通过对象使用this指针,如果我们知道一个对象this指针的位置可以直接使用吗?
  34. this指针只有在成员函数中才有定义。因此,你获得一个对象后,也不能通过对象使用this指针。所以,我们也无法知道一个对象的this指针的位置(只有在成员函数里才有this指针的位置)。当然,在成员函数里,你是可以知道this指针的位置的(可以&this获得),也可以直接使用的。
  35. #6:每个类编译后,是否创建一个类中函数表保存函数指针,以便用来调用函数?
  36. 普通的类函数(不论是成员函数,还是静态函数),都不会创建一个函数表来保存函数指针的。只有虚函数才会被放到函数表中。
  37. 但是,既使是虚函数,如果编译器能明确知道调用的是哪个函数,编译器就不会通过函数表中的指针来间接调用,而是会直接调用该函数。
  38. # 7:这些编译器如何做到的?8:能否模拟实现?
  39. 知道原理后,这两个问题就很容易理解了。
  40. 其实,模拟实现this的调用,在很多场合下,很多人都做过。
  41. 例如,系统回调函数。系统回调函数有很多,如定时,线程啊什么的。
  42. 举一个线程的例子:
  43. class A{
  44. int n;
  45. public:
  46. static void run(void* pThis){
  47. A* this_ = (A*)pThis;
  48. this_->process();
  49. }
  50. void process(){}
  51. };
  52. main(){
  53. A a;
  54. _beginthread( A::run, 0, &a );
  55. }
  56. 这里就是定义一个静态函数来模拟成员函数。
  57. 也有许多C语言写的程序,模拟了类的实现。如freetype库等等。
  58. 其实,有用过C语言的人,大多都模拟过。只是当时没有明确的概念罢了。
  59. 如:
  60. typedef struct student{
  61. int age;
  62. int no;
  63. int scores;
  64. }Student;
  65. void initStudent(Student* pstudent);
  66. void addScore(Student* pstudent, int score);
  67. ...
  68. 如果你把 pstudent改成this,那就一样了。
  69. 它相当于:
  70. class Student{
  71. public:
  72. int age; int no; int scores;
  73. void initStudent();
  74. void addScore(int score);
  75. }
  76. const常量可以有物理存放的空间,因此是可以取地址的
  77. ///this指针是在创建对象前创建.
  78. this指针放在栈上,在编译时刻已经确定.
  79. 并且当一个对象创建后,并且运行整个程序运行期间只有一个this指针.
  80. 先要理解class的意思。class应该理解为一种类型,象int,char一样,是用户自定义的类型。(虽然比int char这样build-in类型复杂的多,但首先要理解它们一样是类型)。用这个类型可以来声明一个变量,比如int x, myclass my等等。这样就像变量x具有int类型一样,变量my具有myclass类型。 理解了这个,就好解释this了,my里的this 就是指向my的指针。如果还有一个变量myclass mzmzthis就是指向mz的指针。 这样就很容易理解this 的类型应该是myclass *,而对其的解引用*this就应该是一个myclass类型的变量。 通常在class定义时要用到类型变量自身时,因为这时候还不知道变量名(为了通用也不可能固定实际的变量名),就用this这样的指针来使用变量自身。
  81. 1. this指针的用处:
  82. 一个对象的this指针并不是对象本身的一部分,不会影响sizeof(对象)的结果。this作用域是在类内部,当在类的非静态成员函数中访问类的非静态成员的时候,编译器会自动将对象本身的地址作为一个隐含参数传递给函数。也就是说,即使你没有写上this指针,编译器在编译的时候也是加上this的,它作为非静态成员函数的隐含形参,对各成员的访问均通过this进行。 例如,调用date.SetMonth(9) <===> SetMonth(&date, 9),this帮助完成了这一转换 .
  83. 2. this指针的使用:
  84. 一种情况就是,在类的非静态成员函数中返回类对象本身的时候,直接使用 return *this;另外一种情况是当参数与成员变量名相同时,如this->n = n (不能写成n = n)。
  85. 3. this指针程序示例:
  86. this指针是存在与类的成员函数中,指向被调用函数所在的类实例的地址。
  87. 根据以下程序来说明this指针 #include<iostream.h> 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="<<x<<"y="<<y<<endl;} };
  88. void main( ) { Point point1( 10,10); point1.MovePoint(2,2); point1.print( ); }
  89. 当对象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;
  90. 4. 关于this指针的一个精典回答:
  91. 当你进入一个房子后, 你可以看见桌子、椅子、地板等, 但是房子你是看不到全貌了。
  92. 对于一个类的实例来说, 你可以看到它的成员函数、成员变量, 但是实例本身呢? this是一个指针,它时时刻刻指向你这个实例本身。
  93. C++中的this指针
  94. 一个对象的成员函数其实就是一般的全局函数,只是编译器给它隐含加了一个指向该对象的const指针,这就是this指针。下面让我们一起来了解一下this指针吧!
  95. 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指针
  96. #include<iostream.h>
  97. class Point
  98. {
  99. int x, y;
  100. public:
  101. Point(int a, int b) { x=a; y=b;}
  102. void MovePoint( int a, int b){ x+=a; y+=b;}
  103. void print(){ cout<<"x="<<x<<"y="<<y<<endl;}
  104. };
  105. void main( )
  106. {
  107. Point point1( 10,10);
  108. point1.MovePoint(2,2);
  109. point1.print( );
  110. }
  111. 当对象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指针,才使得有不同的实例,要不一个类岂不是就像一个实例了??

发表评论

表情:
评论列表 (有 0 条评论,316人围观)

还没有评论,来说两句吧...

相关阅读

    相关 C++ this指针

    this 是 C++ 中的一个关键字,也是一个 const 指针,它指向当前对象,通过它可以访问当前对象的所有成员。 所谓当前对象,是指正在使用的对象。例如对于stu.sho

    相关 C++ this 指针

    C++ this 指针 在 C++ 中,每一个对象都能通过 `this` 指针来访问自己的地址。`this` 指针是所有成员函数的隐含参数。在成员函数内部,它可以用来指向

    相关 c++this指针

    c++的对象里有一个指针一直指向他自己,这个指针就是this指针,这个指针是在类的成员函数内部隐式调用的。可以认为在类调用成员函数的时候,编译器会自动的在参数列表的最后一个位置

    相关 c++ this 指针

    1. this指针的用处:   一个对象的this指针并不是对象本身的一部分,不会影响sizeof(对象)的结果。this作用域是在类内部,当在类的非静态成员函数中访问类的非

    相关 C++——this指针

     一 this指针的使用(成员函数中) 当通过一个对象调用成员函数时,编译器会把当前对象的地址传递给this指针;(this指针保存的是当前对象的地址) //thi

    相关 C++中this指针

    this指针作为一个隐含参数传递给非静态成员函数,用以指向该成员函数所属类所定义的对象。当不同的对象调用同一个类的成员函数代码时,编译器会依据该成员函数的this指针所指向的不