2018.7.11学习内容: c++中 this指针详解

this 是 c++中的一个关键字,也是一个常量指针,指向当前对象,也就是当前对象的首地址。通过this指针,可以访问当前对象的成员变量和成员函数。

【特性】

1.  this指针的类型是 类类型* const

2.  this指针并不是对象本身的一部分,不会影响sizeof的结果

3.  this的作用域在类成员函数的内部

4.  this指针是类成员函数的第一个默认隐含参数,编译器自动维护传递

5.  只有在类的非静态成员函数中才可以使用this指针

所谓的当前对象,就是正在使用的对象,例如stu.print(); stu 就是当前对象,系统正在访问stu的成员函数print()

假设this指向stu对象 那么 下面的pStu 的值就和this的值相同

  1. Student stu;
  2. Student * const pStu = &stu;
下面演示一个完整的例子
  1. #include <iostream>
  2. using namespace std;
  3. class Student
  4. {
  5. public:
  6. void setName(char *);
  7. void setAge(int );
  8. void print();
  9. private:
  10. char *name;
  11. int age;
  12. double score;
  13. };
  14. void Student::setName( char* name)
  15. {
  16. this->name = name;
  17. }
  18. void Student::setAge( int age)
  19. {
  20. this->age = age;
  21. }
  22. void Student::print()
  23. {
  24. cout << this->name << ":" << this->age << "岁" << endl;
  25. }
  26. int main()
  27. {
  28. Student stu1;
  29. stu1.setName( "小王");
  30. stu1.setAge( 18);
  31. stu1.print();
  32. Student stu2;
  33. stu2.setName( "李元霸");
  34. stu2.setAge( 16);
  35. stu2.print();
  36. return 0;
  37. }
输出结果:

小王:18岁

李元霸:16岁

对象和普通的变量类似,每个对象都占用若干字节的内存,用来保存成员变量的值,

不同对象占用的内存互不重叠。

上面的例子中创建stu1时,this指针就指向了stu1所在内存块的首字节,创建stu2时,this指针就指向了stu所在内存块的首字节...

现在添加下面的函数 用来输出this的值,验证this的值与 对象的地址是否相同:

  1. void Student::printAddr()
  2. {
  3. cout << this << endl;
  4. }

接着在main函数中输出创建对象并调用函数:

  1. int main()
  2. {
  3. Student stu1;
  4. Student *pStu1 = &stu1;
  5. stu1.printAddr();
  6. cout << pStu1 << endl;
  7. Student stu2;
  8. Student *pStu2 = &stu2;
  9. stu2.printAddr();
  10. cout << pStu2 << endl;
  11. return 0;
  12. }

输出结果:

0030FBEC
0030FBEC
0030FBC8
0030FBC8

输出结果显示了this确实指向了当前对象的首地址,而且对于不同的对象,this的值也不一样。

切记:

~~this 是常量指针,它的值不能被修改

~~this 只能在成员函数内部使用

~~只有对象被创建后this才有意义,因此不能再static成员函数中使用

实际上,this指针是作为函数的参数隐式传递的,它并不出现在参数列表中,调用成员函数时,系统(编译器)自动获取当前对象的地址,并赋给this,完成参数的传递。

this作为隐式参数,本质上是成员函数的局部变量,不占用对象的内存,只有在发生成员函数调用时才会给this赋值,函数调用结束,this被销毁。

在《C++函数编译原理和成员函数的实现》讲到,成员函数最终被编译成与对象无关的普通函数,除了成员变量,会丢失所有信息,所以在编译时要在成员函数中添加一个额外的参数,把当前对象的首地址传入,以此来关联成员函数和成员变量。

 这个额外的参数也就是this  ,它是成员函数和成员变量之间的桥梁


猜你喜欢

转载自blog.csdn.net/qq_42022726/article/details/80995415