• C语言日记 32 类的对象,this指针


    例8-4时钟类的完整程序。

    源程序:

    1. #include
    2. using namespace std;//类的定义
    3. class Clock
    4. {
    5. public:
    6. void SetTime(int NewH, int NewM, int NewS);
    7. void ShowTime();
    8. private:
    9. int Hour, Minute, Second;
    10. };
    11. //时钟类成员函数的实现
    12. void Clock::SetTime(int NewH, int NewM, int NewS)
    13. {
    14. Hour = NewH;
    15. Minute = NewM;
    16. Second = NewS;
    17. }
    18. void Clock::ShowTime()
    19. {
    20. cout << Hour << ":" << Minute << ":" << Second << endl;
    21. }
    22. //主函数
    23. int main()
    24. {
    25. Clock myClock;//定义对象
    26. myClock.SetTime(8, 30, 0);
    27. myClock.ShowTime();
    28. return 0;
    29. }

    结果:

    例8-5对象数组的使用方法。

    源程序:

    1. #include
    2. using namespace std;
    3. class Box
    4. {
    5. private:
    6. int height;
    7. int width;
    8. int length;
    9. public:
    10. void SetBox(int h = 10, int w = 12, int len = 15)
    11. {
    12. height = h;
    13. width = w;
    14. length = len;
    15. }
    16. int volume();
    17. };
    18. int Box::volume()
    19. {
    20. return (height * width * length);
    21. }
    22. int main()
    23. {
    24. Box a[3]; //定义对象数组
    25. a[0].SetBox();
    26. a[1].SetBox(15, 18, 20);
    27. a[2].SetBox(16, 20, 26);
    28. cout << "volume of a[0] is " << a[0].volume() << endl;
    29. cout << "volume of a[1] is " << a[1].volume() << endl;
    30. cout << "volume of a[2] is " << a[2].volume() << endl;
    31. return 0;
    32. }

    结果:

    书P123:

    可以通过对象(例如a[0])访问到他(对象数组)的公有成员

    这里面的公有成员在这里(上述程序里)只包含了公有的那几个函数,不包含任何变量

    也就是说在上述程序里我们已经用完了所有的公有成员,没办法输出任何对象数组的单个属性

    除非将输出的属性改为公有:

    1. #include
    2. using namespace std;
    3. class Box
    4. {
    5. private:
    6. int width;
    7. int length;
    8. public:
    9. int height;
    10. void SetBox(int h = 10, int w = 12, int len = 15)
    11. {
    12. height = h;
    13. width = w;
    14. length = len;
    15. }
    16. int volume();
    17. };
    18. int Box::volume()
    19. {
    20. return (height * width * length);
    21. }
    22. int main()
    23. {
    24. Box a[3]; //定义对象数组
    25. a[0].SetBox();
    26. a[1].SetBox(15, 18, 20);
    27. a[2].SetBox(16, 20, 26);
    28. cout << a[0].height << endl;
    29. return 0;
    30. }

    结果:

     另外值得注意的是:

    输出时我们只能输出变量,不能输出形参,例如:(输入)

    cout << a[1].h << endl;

    结果:

    修改例8-5,在主函数中定义以下语句:

    1. int main()
    2. {
    3. Box t;//定义t为 Box 类对象
    4. Box* pt;//定义 pt 为指向 Box类对象的指针变量
    5. pt = &t;//将t 的起始地址赋给 pt
    6. (*pt).SetBox();//调用 pt 所指向的对象中的 SetBox()函数,即t.SetBox
    7. cout << "Volume of a[0]is" << pt->volume() << endl;//调用pt 所指
    8. //向的对象中的Volume()函数,即t.Volume
    9. return 0;
    10. }

    补充为完整程序:

    1. #include
    2. using namespace std;
    3. class Box
    4. {
    5. private:
    6. int height;
    7. int width;
    8. int length;
    9. public:
    10. void SetBox(int h = 10, int w = 12, int len = 15)
    11. {
    12. height = h;
    13. width = w;
    14. length = len;
    15. }
    16. int volume();
    17. };
    18. int Box::volume()
    19. {
    20. return (height * width * length);
    21. }
    22. int main()
    23. {
    24. Box t;//定义t为 Box 类对象
    25. Box* pt;//定义 pt 为指向 Box类对象的指针变量
    26. pt = &t;//将t 的起始地址赋给 pt
    27. (*pt).SetBox();//调用 pt 所指向的对象中的 SetBox()函数,即t.SetBox
    28. cout << "Volume of a[0]is" << pt->volume() << endl;//调用pt 所指
    29. //向的对象中的Volume()函数,即t.Volume
    30. return 0;
    31. }

    结果:

    例8-6有关对象指针的使用方法。

    源程序:

    1. #include
    2. using namespace std;
    3. class Time
    4. {
    5. public:
    6. int Hour;
    7. int Minute;
    8. int Second;
    9. void SetTime(int H, int M, int S);
    10. void Get_Time();
    11. };
    12. void Time::SetTime(int H, int M, int S)
    13. {
    14. Hour = H;
    15. Minute = M;
    16. Second = S;
    17. }
    18. void Time::Get_Time()//定义公有成员函数
    19. {
    20. cout << Hour << ":" << Minute << ":" << Second << endl;
    21. }
    22. int main()
    23. {
    24. Time t1;//定义 Time 类对象 t1
    25. int* p1 = &t1.Hour;
    26. //定义指向整型数据的指针变量p1,并使 p1 指向 t1.Hour
    27. t1.SetTime(10, 13, 56);
    28. cout << *p1 << endl;
    29. //输出p1所指的数据成员t1.Hour
    30. t1.Get_Time();//调用对象t1的成员函数Get_Time
    31. Time* p2 = &t1; //定义指向 Time 类对象的指针变量 p2,并使 p2 指向t1
    32. p2->Get_Time();//调用 p2 所指向对象(即t1)的Get_Time 函数
    33. void(Time:: * p3)();//定义指向 Time 类公用成员函数的指针变量P3
    34. p3 = &Time::Get_Time;//使p3 指向 Time 类公用成员函数 Get_Time
    35. (t1.*p3)();//调用对象t1中p3所指的成员函数(即t1.Get_Time())
    36. return 0;
    37. }

    结果:

    对于t1:如果我们本身没有给t1赋值,即:将主函数改为        

    1. int main()
    2. {
    3. Time t1;//定义 Time 类对象 t1
    4. int* p1 = &t1.Hour;
    5. //定义指向整型数据的指针变量p1,并使 p1 指向 t1.Hour
    6. cout << *p1 << endl;
    7. return 0;
    8. }

    则输出一个任意值(系统随机分配的值):

    另外,这里的

    p2->Get_Time();等价于 (*p2).Get_Time();等价于 t1.Get_Time();

    验证:

    1. #include
    2. using namespace std;
    3. class Time
    4. {
    5. public:
    6. int Hour;
    7. int Minute;
    8. int Second;
    9. void SetTime(int H, int M, int S);
    10. void Get_Time();
    11. };
    12. void Time::SetTime(int H, int M, int S)
    13. {
    14. Hour = H;
    15. Minute = M;
    16. Second = S;
    17. }
    18. void Time::Get_Time()//定义公有成员函数
    19. {
    20. cout << Hour << ":" << Minute << ":" << Second << endl;
    21. }
    22. int main()
    23. {
    24. Time t1;//定义 Time 类对象 t1
    25. t1.SetTime(10, 13, 56);
    26. t1.Get_Time();//调用对象t1的成员函数Get_Time
    27. Time* p2 = &t1; //定义指向 Time 类对象的指针变量 p2,并使 p2 指向t1
    28. p2->Get_Time();//调用 p2 所指向对象(即t1)的Get_Time 函数
    29. (*p2).Get_Time();
    30. t1.Get_Time();
    31. return 0;
    32. }

    结果:

    例8-7 this指针的作用

    源程序:

    1. #include
    2. using namespace std;
    3. class A
    4. {
    5. private:
    6. int i;
    7. public:
    8. int get() const { return i;}
    9. void set(int x)
    10. {
    11. this->i = x;
    12. cout << "this 指针保存的内存地址为:" << this << endl;
    13. }
    14. };
    15. //
    16. int main()
    17. {
    18. A a;
    19. a.set(9);
    20. cout << "对象a所在的内存地址为:" << &a << endl;
    21. cout << "对象 a所保存的值为:" << a.get() << endl;
    22. cout << endl;
    23. A b;
    24. b.set(999);
    25. cout << "对象b所在的内存地址为:" << &b << endl;
    26. cout << "对象b 所保存的值为:" << b.get() << endl;
    27. return 0;
    28. }

    结果:

    问题:

    一:代码段

        this->i = x;

    有意思(意义)吗?他这里不写这一段程序运行结果不也一样?

    如果写了:

     ((this->i )= x;)

    第一步:this指针指向i变量

    注意:这里的this虽然是一个指针,但是这里用了成员选择符号“->”,它并不是指向目标对象的地址,而是访问目标对象

    第二步:this指针(也就是this指针指向i变量)等于x;

    如果没写:

    (1):将对象的地址赋给this指针

    (2):调用成员函数

    二:他这里这个const的这个用法是什么意思?我好像没见过啊?

    之前确实没学过const关于常量指针的用法:

    const :

    表示该函数不修改任何值;详见:35 类和对象-对象特性-const修饰成员函数_哔哩哔哩_bilibili

    const:

    • 1.修饰变量时,表示:该变量是常量;即:该变量不可改(变)
    • 2.修饰成员函数时,(即:放在成员函数"尾巴"上)
    • 在这里,即“const”在“int get()”成员函数的背后(后面)
    • 该成员函数被称为“常(量)成员函数”;表示该成员函数不可以修改类内的成员变量(为了保证封装性)
       

    回归到本例中,即表示(我们只要知道):成员函数get()不能改变成员变量i(即可)

    参考与LSGO一起学“8指针(8.19 常量指针)”,试图用实践证明上述结论:

    1.const修饰变量时,表示:该变量是常量;即:该变量不可改(变)

    project 1:

    1. #include
    2. using namespace std;
    3. int main()
    4. {
    5. int a = 3;
    6. int const* p = &a;
    7. cout << "*p=" << *p << endl;
    8. cout << "a=" << a << endl;
    9. }

    结果:

    *p=3
    a=3

    project 2:

    1. #include
    2. using namespace std;
    3. int main()
    4. {
    5. int a = 3;
    6. int const* p = &a;
    7. *p = 4;
    8. cout <<"*p=" << *p << endl;
    9. cout << "a=" << a << endl;
    10. }

    结果:

     这里的:  “p”: 不能给常量赋值;无疑已经说明:该(被const修饰的)变量是常量,不可改(变)。

    project 3:

    1. #include
    2. using namespace std;
    3. int main()
    4. {
    5. int a = 3;
    6. int const* p = &a;
    7. p++;
    8. cout << "*p=" << *p << endl;
    9. cout << "a=" << a << endl;
    10. }

    结果:

     *p=-858993460
    a=3

    OK,到这里关于这个const我们先到这里点到为止

    具体详细情况以后再说,详见与LSGO一起学“8指针(8.19 常量指针)”

  • 相关阅读:
    【Linux从青铜到王者】 基础IO
    按键精灵打怪学习-窗口绑定技能
    k8s创建pod-affinity亲和性时报错解决办法
    Java 主要三大程序流程控制
    互联网Java工程师面试题·Spring篇·第三弹
    网络安全(6)
    全志A40i开发板硬件说明书——100%国产+工业级方案(中)
    04|主观与客观评价音频质量
    基于Java的二手交易市场系统设计与实现
    Spring Security 集成 OAuth 2.0 认证(二)
  • 原文地址:https://blog.csdn.net/Zz_zzzzzzz__/article/details/127690650