C++ this 指针

素颜马尾好姑娘i 2022-11-05 11:50 16阅读 0赞

C++ this 指针

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

友元函数没有 this 指针,因为友元不是类的成员。只有成员函数才有 this 指针。this 关键字只能用于成员函数,不能用于被 static 修饰的静态函数。this 指代的是当前上下文。

this 指针是隐含在对象成员函数内的一种指针,成员函数通过 this 指针可以知道操作的是哪个对象的数据。静态成员函数内部没有 this 指针,静态成员函数不能操作非静态成员变量,静态成员函数是属于类,函数内部没有 this 指针。当形参和成员变量同名时,可用 this 指针来区分。

this 是 C++ 的一个关键字,也是一个 const 指针,它指向当前对象,通过它可以访问当前对象的所有成员,它的值是不能被修改的。当前对象,是指正在使用的对象。info.set_count(10);info 是当前对象,this 指向 infothis 是一个指针,要用 -> 来访问成员变量或成员函数。在对象被创建以后会给 this 赋值,赋值的过程是编译器自动完成的,不需要用户干预,用户也不能显式地给 this 赋值。this 指向当前对象,而且对于不同的对象,this 的值是不一样。

this 只能在成员函数内部使用,用在其他地方没有意义,也是非法的。当对象被创建后 this 才有意义,因此不能在 static 成员函数中使用。

this 实际上是成员函数的一个形参,在调用成员函数时将对象的地址作为实参传递给 this。不过 this 这个形参是隐式的,它并不出现在代码中,而是在编译阶段由编译器默默地将它添加到参数列表中。

this 作为隐式形参,本质上是成员函数的局部变量,所以只能用在成员函数的内部,并且只有在通过对象调用成员函数时才给 this 赋值。

成员函数最终被编译成与对象无关的普通函数,除了成员变量,会丢失所有信息,所以编译时要在成员函数中添加一个额外的参数,把当前对象的首地址传入,以此来关联成员函数和成员变量。这个额外的参数,实际上就是 this,它是成员函数和成员变量关联的桥梁。

this 指代的是当前上下文,this 表示的对象是这个方法活动的上下文。当我们调用成员函数时,实际上是替某个对象调用它。成员函数通过一个名为 this 的额外隐式参数来访问调用它的那个对象,当我们调用一个成员函数时,用请求该函数的对象地址初始化 this

成员函数通过一个名为 this 的额外隐式参数来访问调用它的那个对象,当我们调用一个成员函数时,用请求该函数的对象地址初始化 this

1. Example

  1. //============================================================================
  2. // Name : Yongqiang Cheng
  3. // Author : Yongqiang Cheng
  4. // Version : Version 1.0.0
  5. // Copyright : Copyright (c) 2020 Yongqiang Cheng
  6. // Description : Hello World in C++, Ansi-style
  7. //============================================================================
  8. #ifndef _CRT_SECURE_NO_WARNINGS
  9. #define _CRT_SECURE_NO_WARNINGS
  10. #endif
  11. #include <iostream>
  12. class Qiang {
  13. public:
  14. static int cnt;
  15. int count;
  16. void set_count(const int num) {
  17. // count = num;
  18. this->count = num;
  19. }
  20. };
  21. // static
  22. int Qiang::cnt = 9;
  23. int main() {
  24. Qiang info;
  25. Qiang data;
  26. std::cout << Qiang::cnt << std::endl;
  27. std::cout << info.cnt << std::endl;
  28. std::cout << data.cnt << std::endl;
  29. info.cnt = 16;
  30. std::cout << Qiang::cnt << std::endl;
  31. std::cout << info.cnt << std::endl;
  32. std::cout << data.cnt << std::endl;
  33. info.set_count(10);
  34. std::cout << "info.count = " << info.count << std::endl;
  35. data.set_count(20);
  36. std::cout << "data.count = " << data.count << std::endl;
  37. std::cout << "Hello, World!\n" << std::endl;
  38. return 0;
  39. }
  40. /home/yongqiang/CLionProjects/hash_table/cmake-build-debug/hash_table
  41. 9
  42. 9
  43. 9
  44. 16
  45. 16
  46. 16
  47. info.count = 10
  48. data.count = 20
  49. Hello, World!
  50. Process finished with exit code 0

2. Example

  1. //============================================================================
  2. // Name : Yongqiang Cheng
  3. // Author : Yongqiang Cheng
  4. // Version : Version 1.0.0
  5. // Copyright : Copyright (c) 2020 Yongqiang Cheng
  6. // Description : Hello World in C++, Ansi-style
  7. //============================================================================
  8. #ifndef _CRT_SECURE_NO_WARNINGS
  9. #define _CRT_SECURE_NO_WARNINGS
  10. #endif
  11. #include <iostream>
  12. class Qiang {
  13. public:
  14. void set_name(const char *name);
  15. void set_age(const int age);
  16. void set_score(const float score);
  17. void display();
  18. private:
  19. const char *name;
  20. int age;
  21. float score;
  22. };
  23. void Qiang::set_name(const char *name) {
  24. this->name = name;
  25. }
  26. void Qiang::set_age(const int age) {
  27. this->age = age;
  28. }
  29. void Qiang::set_score(const float score) {
  30. this->score = score;
  31. }
  32. void Qiang::display() {
  33. std::cout << this->name << " " << this->age << " " << this->score << std::endl;
  34. }
  35. int main() {
  36. Qiang info;
  37. std::string name = "yongqiang";
  38. info.set_name(name.c_str());
  39. info.set_age(16);
  40. info.set_score(96.5);
  41. info.display();
  42. std::cout << "Hello, World!\n" << std::endl;
  43. return 0;
  44. }
  45. /home/yongqiang/CLionProjects/hash_table/cmake-build-debug/hash_table
  46. yongqiang 16 96.5
  47. Hello, World!
  48. Process finished with exit code 0

References

发表评论

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

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

相关阅读

    相关 C++:07---this指针

    一、this指针介绍 概念:this指针是成员函数的一个隐式参数,在类中本质上就是对象的指针(常量指针) 特点: 在成员函数中可通过this指针区

    相关 c++笔记----this指针

    this指针 1. this是一个特殊的指针 1. 指向调用该成员函数的那个对象。 2. 是一个隐含每一个非静态成员函数的特殊指针。 1. 对象调

    相关 C++ this 指针

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

    相关 c++的this指针

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

    相关 C++ this 指针 浅析

    【摘要】 本文分三部分。第一部分this指针的的产生原因,即为了让不同对象调用同一函数时,通过this指针来对不同对象的地址加以区别实现函数共用。第二部分讲述this指针的使

    相关 c++ this 指针

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

    相关 C++之this指针

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

    相关 C++——this指针

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