• C++学习:this指针


    this指针

    类的对象有成员变量和成员函数构成,从程序运行的角度,独享是由数据和函数构成的,数据可以位于栈、堆、全局数据区;函数只能位于代码段,所有的对象共享一套成员函数。

    成员函数能直接访问对象的属性(成员变量),是因为成员函数中有一个隐藏参数this指针,用于指代当前的对象。

    1. #include
    2. using namespace std;
    3. class Test
    4. {
    5. private:
    6. int mi;
    7. public:
    8. //有参构造函数
    9. Test(int i)
    10. {
    11. mi = i;
    12. }
    13. //拷贝构造函数
    14. Test(const Test& t)
    15. {
    16. }
    17. //返回mi
    18. int getMi()
    19. {
    20. return mi;
    21. }
    22. //打印this指针
    23. void print()
    24. {
    25. cout << "this = " << this << endl;
    26. }
    27. };
    28. int main()
    29. {
    30. Test t1(1);
    31. Test t2(2);
    32. Test t3(3);
    33. cout << "t1.getMi() = " << t1.getMi() << endl;
    34. cout << "&t1 = " << &t1 << endl;
    35. t1.print();
    36. cout << endl;
    37. cout << "t2.getMi() = " << t2.getMi() << endl;
    38. cout << "&t2 = " << &t2 << endl;
    39. t2.print();
    40. cout << endl;
    41. cout << "t3.getMi() = " << t3.getMi() << endl;
    42. cout << "&t3 = " << &t3 << endl;
    43. t3.print();
    44. cout << endl;
    45. return 0;
    46. }

    输出结果

    1. t1.getMi() = 1
    2. &t1 = 0x64fe0c
    3. this = 0x64fe0c
    4. t2.getMi() = 2
    5. &t2 = 0x64fe08
    6. this = 0x64fe08
    7. t3.getMi() = 3
    8. &t3 = 0x64fe04
    9. this = 0x64fe04

    结果分析:

    通过结果可以看出打印的this指针与对象的地址是一样的,这个this指针是一个隐藏的参数。

    静态成员变量

    我们知道对象的成员变量一般不能被外界所访问,每个对象有自己独立的一套成员变量,那有没有可能在类中高一个成员变量,让所有对象共享这个成员变量,这就需要静态成员变量

    静态成员变量的特征:

    1、静态成员变量属于整个类所有,而不是某个对象;

    2、静态成员变量的生命周期不依赖于任何对象;

    3、可以通过类名直接访问公有的静态成员变量;

    4、所有对象共享类的静态成员变量;

    5、可以通过对象名访问公有的静态成员变量;

    6、静态成员变量需要再类的外面单独分配空间;

    7、静态成员变量在程序内部位于全局数据区;

    静态成员变量的

    比如要统计在程序运行期间某个类的对象数目,不使用全局变量,还要随时获取当前类对象的数目。可以通过下面的代码来实现

    头文件 

    1. #ifndef COUNT_H
    2. #define COUNT_H
    3. class Count
    4. {
    5. private:
    6. static int mCount; //定义一个静态成员变量
    7. public:
    8. Count();
    9. ~Count();
    10. int getCount();
    11. };
    12. #endif // COUNT_H

     源文件

    1. #include "count.h"
    2. //用初始化列表将mCount初始化为0
    3. Count::Count()
    4. {
    5. mCount++; //每定义一个对象,就会调用构造函数
    6. }
    7. Count::~Count()
    8. {
    9. mCount--;//每删除一个对象,就会调用析构函数
    10. }
    11. //返回在运行的对象数目
    12. int Count::getCount()
    13. {
    14. return mCount;
    15. }

     应用

    1. #include
    2. #include "count.h"
    3. using namespace std;
    4. Count gc; //定义一个全局对象
    5. int Count::mCount = 0; //静态成员变量初始化
    6. int main()
    7. {
    8. Count c1; //定义一个局部对象
    9. Count c2;//定义一个局部对象
    10. cout << gc.getCount() << endl; //应该输出3
    11. cout << c1.getCount() << endl; //应该输出3
    12. cout << c2.getCount() << endl; //应该输出3
    13. Count* pt = new Count();
    14. cout << pt->getCount() << endl; //应该输出4
    15. delete pt;
    16. cout << gc.getCount() << endl; //应该输出3
    17. return 0;
    18. }

    静态成员函数

    上面的代码能实现:

    1、统计程序运行期间类的对象的数目;

    2、不使用全局变量

    但是不能实现随时获取对象的数目

    每次获取对象数目的时候都需要调用getCount()这个函数,但是如果程序中一个对象都没有定义,也应该能获取对象的数目是0,但是对象都没有了,怎么调用getCount()这个函数?

    我们需要不依赖对象就可以访问静态成员变量,还要保证静态成员变量的安全性,此时就需要静态成员函数,静态成员函数有如下特征:

    1、静态成员函数时类中特殊的成员函数;

    2、静态成员函数属于整个类所有;

    3、可以通过类名直接访问公有的静态成员函数;

    4、可以通过对象名访问公有的静态成员函数。

    5、静态成员函数可以通过类名直接访问;

    6、静态成员函数只能直接访问静态成员变量。

    将关键字static加在成员函数前就变成静态成员函数了。

    修改上面代码的头文件,就是在int getCount()前面加个static;

    1. #ifndef COUNT_H
    2. #define COUNT_H
    3. class Count
    4. {
    5. private:
    6. static int mCount; //定义一个静态成员变量
    7. public:
    8. Count();
    9. ~Count();
    10. static int getCount(); //声明静态成员函数
    11. };
    12. #endif // COUNT_H

    应用代码,使用类名来调用静态成员函数,不依赖于特定的对象。

    1. #include
    2. #include "count.h"
    3. using namespace std;
    4. int Count::mCount = 0; //静态成员变量初始化
    5. int main()
    6. {
    7. //通过类名来调用静态成员函数
    8. cout << Count::getCount() << endl; //应该输出0
    9. Count c1; //定义一个局部对象
    10. Count c2;//定义一个局部对象
    11. cout << Count::getCount() << endl; //应该输出2
    12. Count* pt = new Count();
    13. cout << Count::getCount() << endl; //应该输出2
    14. delete pt;
    15. return 0;
    16. }

    这样,统计在程序运行期间某个类的对象数目的代码就结束了,满足全部需求。

  • 相关阅读:
    C语言典范编程
    计算机毕业设计ssm高校学生宿舍管理系统183rq系统+程序+源码+lw+远程部署
    数据结构 day4 链表
    进程间通信
    Web大学生网页作业成品:基于html制作中国科技发展网站设计题材【航天之路7页】HTML+CSS+JavaScript
    【案例分享】H3C交换机堆叠配置
    JDBC常见面试题
    upload-labs通关(Pass11-Pass15)
    无脚本自动化测试
    vue3基本使用笔记(更新中)
  • 原文地址:https://blog.csdn.net/m0_49968063/article/details/134054804