为构建清朗、和谐、绿色、健康的网络环境,维护网络文明秩序,保障用户合法权益,菜鸟资源平台依据并贯彻《中华人民共和国民法典》、《中华人民共和国网络安全法》、《中华人民共和国个人信息保护法》、《中华人民共和国未成年人保护法》、《中华人民共和国预防未成年人犯罪法》、《网络信息内容生态治理规定》等相关法律法规及主管部门的管理政策,与用户共同制定《菜鸟资源平台自律公约》(以下简称“本公约”)。 立即查看
通知图标

正在访问 第八章丨C++编程宝典:快速上手、深入进阶、挑战高级技巧,助你成为编程达人

第八章丨C++编程宝典:快速上手、深入进阶、挑战高级技巧,助你成为编程达人

第八章丨C++编程宝典:快速上手、深入进阶、挑战高级技巧,助你成为编程达人

接上一章节继续:第七章丨C++编程宝典:快速上手、深入进阶、挑战高级技巧,助你成为编程达人 – 菜鸟资源 (xiciw.com) 4.15.static const 成员 如果一个类的成员,既要实现共享,又要实现不可改变,那就用 stati...

当前版本

软件大小

软件语言

是否破解

第八章丨C++编程宝典:快速上手、深入进阶、挑战高级技巧,助你成为编程达人

接上一章节继续:第七章丨C++编程宝典:快速上手、深入进阶、挑战高级技巧,助你成为编程达人 – 菜鸟资源 (xiciw.com)

4.15.static const 成员

如果一个类的成员,既要实现共享,又要实现不可改变,那就用 static const 修饰。

修饰成员函数,格式并无二异,修饰数据成员。必段要类内部实始化

  1. class A
  2. {
  3. public:
  4. static const void dis()
  5. {
  6. cout<<i<<endl;
  7. }
  8. private:
  9. const static int i = 100;
  10. };
  11. int main()
  12. {
  13. A::dis();
  14. return 0;
  15. }

4.16.指向成员的指针

在 C++语言中,可以定义一个指针,使其指向类成员或成员函数,然后通过指针

来访问类的成员。这包括指向属性成员的指针和指向成员函数的指针。

4.16.1. 指向普通变量和函数的指针

  1. #include <iostream>
  2. using namespace std;
  3. void func(int a)
  4. {
  5. cout<<a<<endl;
  6. }
  7. int main()
  8. {
  9. int a = 100;
  10. int *p = &a;
  11. cout<<*p<<endl;
  12. void (*pf)(int) = func;
  13. pf(10);
  14. return 0;
  15. }

4.16.2. 指向类数据成员的指针

 定义

  1. <数据类型><类名>::*<指针名>

 赋值&初始化

  1. <数据类型><类名>::*<指针名>[=&<类名>::<非静态数据成员>]

指向非静态数据成员的指针在定义时必须和类相关联,在使用时必须和具体的对象关联。

 解用引

由于类不是运行时存在的对象。因此,在使用这类指针时,需要首先指定类的一个对象,然后,通过对象来引用指针所指向的成员。

  1. <类对象名>.*<指向非静态数据成员的指针>
  2. <类对象指针>->*<指向非静态数据成员的指针>

 案例

  1. #include <iostream>
  2. using namespace std;
  3. class Student
  4. {
  5. public:
  6. Student(string n, int nu):name(n),num(nu){}
  7. string name;
  8. int num;
  9. };
  10. int main()
  11. {
  12. Student s("zhangsan",1002);
  13. Student s2("lisi",1001);
  14. // string *ps = &s.name;
  15. // cout<< *ps<<endl;
  16. string Student::*ps = &Student::name;
  17. cout<<s.*ps<<endl;
  18. cout<<s2.*ps<<endl;
  19. Student *pp = new Student("wangwu",1003);
  20. cout<<pp->*ps<<endl;
  21. return 0;
  22. }

4.16.3. 指向类成员函数的指针

定义一个指向非静态成员函数的指针必须在三个方面与其指向的成员函数保持一

致:参数列表要相同、返回类型要相同、所属的类型要相同

 定义

  1. <数据类型>(<类名>::*<指针名>)(<参数列表>)

 赋值&初始化

  1. <数据类型>(<类名>::*<指针名>)(<参数列表>)[=&<类名>::<非静态成员函数>]

 解用引

由于类不是运行时存在的对象。因此,在使用这类指针时,需要首先指定类的一个对象,然后,通过对象来引用指针所指向的成员。

  1. (<类对象名>.*<指向非静态成员函数的指针>)(<参数列表>)
  2. (<类对象指针>->*<指向非静态成员函数的指针>)(<参数列表>)

 案例

  1. #include <iostream>
  2. using namespace std;
  3. class Student
  4. {
  5. public:
  6. Student(string n, int nu):name(n),num(nu){}
  7. void dis()
  8. {
  9. cout<<"name "<<name<<" num "<<num<<endl;
  10. }
  11. private:
  12. string name;
  13. int num;
  14. };
  15. int main()
  16. {
  17. Student s("zhangsan",1002);
  18. Student s2("lisi",1001);
  19. Student *ps = new Student("lisi",1003);
  20. void (Student::*pf)() = & Student::dis;
  21. (s.*pf)();
  22. (s2.*pf)();
  23. (ps->*pf)();
  24. return 0;
  25. }

小结:

与普通意义上的指针不一样。存放的是偏移量

指向非静态成员函数时,必须用类名作限定符,使用时则必须用类的实例作限定符。

指向静态成员函数时,则不需要使用类名作限定符。

4.16.4. 应用提高

用指向类员函数的指针,实现更加隐蔽的接口。

  1. #include <iostream>
  2. using namespace std;
  3. class Widget
  4. {
  5. public:
  6. Widget()
  7. {
  8. fptr[0] = &f;
  9. fptr[1] = &g;
  10. fptr[2] = &h;
  11. fptr[3] = &i;
  12. }
  13. void select(int idx, int val)
  14. {
  15. if(idx<0 || idx>cnt) return;
  16. (this->*fptr[idx])(val);
  17. }
  18. int count()
  19. {
  20. return cnt;
  21. }
  22. private:
  23. void f(int val){cout<<"void f() "<<val<<endl;}
  24. void g(int val){cout<<"void g() "<<val<<endl;}
  25. void h(int val){cout<<"void h() "<<val<<endl;}
  26. void i(int val){cout<<"void i() "<<val<<endl;}
  27. enum{ cnt = 4};
  28. void (Widget::*fptr[cnt])(int);
  29. };
  30. int main()
  31. {
  32. Widget w;
  33. for(int i=0; i<w.count(); i++)
  34. {
  35. w.select(i,1);
  36. }
  37. return 0;
  38. }

4.16.5. 指向类静态成员的指针

 指向类静态数据成员的指针

指向静态数据成员的指针的定义和使用与普通指针相同,在定义时无须和类相关联,在使用时也无须和具体的对象相关联。

 指向类静态成员函数的指针

指向静态成员函数的指针和普通指针相同,在定义时无须和类相关联,在使用时也无须和具体的对象相关联。

  1. #include <iostream>
  2. using namespace std;
  3. class A
  4. {
  5. public:
  6. static void dis();
  7. static int data;
  8. };
  9. void A::dis()
  10. {
  11. cout<<data<<endl;
  12. }
  13. int A::data = 100;
  14. int main()
  15. {
  16. int *p = & A::data;
  17. cout<<*p<<endl;
  18. void (*pfunc)() = A::dis;
  19. pfunc();
  20. return 0;
  21. }

4.17.作业

4.17.1. 按需求设计一个圆类

输入圆的半径和圆柱的高,依次输出圆周长、圆面积、圆球表面积、圆柱体积(以空格分隔,π取 3.14)。

4.17.2. 编写C++程序完成以下功能:

1)定义一个 Point 类,其属性包括点的坐标,提供计算两点之间距离的方法;

2)定义一个圆形类,其属性包括圆心和半径;

3)创建两个圆形对象,提示用户输入圆心坐标和半径,判断两个圆是否相交,并输出结果

第四小节完,下一章继续讲解第五小节《5. 友元(Friend)

声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。

常见问题

  • 如何安装和激活?

    每款软件会附带有安装教程,您打开安装包一目了然

  • 程序是否已损坏?文件损坏?还是其他错误?

    有错误问题,请您参考:https://www.xxx.com/error

  • 如何更新?正式激活后会发生什么情况?

    除非安装说明中另有说明,否则官方更新可能会导致无法激活。 要从本网站更新软件,您需要在此处下载此软件的新版本(如果可用),并将其安装在计算机上安装的版本之上(替换)。在这种情况下,您将保存此软件的激活和设置。

  • 如何下载?链接不起作用?

    我们使用百度网盘,132云盘和微软网盘,除了百度网盘,其他两款不限速,如果链接失效,请您联系客服处理

  • 已发布更新。我什么时候升级我的版本?

    所有软件如有更新,我们第一时间推送,视自己情况更新使用

  • 如何更改语言?

    打开“系统偏好设置”->“通用>语言和地区”->应用程序-“+”。 选择应用和语言。此方法适用于大多数应用程序。 Adobe 产品中的语言通常是在产品本身的安装阶段选择的。 游戏中的语言通常会在游戏本身的设置中发生变化。

  • 如何删除软件?

    有很多选择。最简单的方法是使用特殊的实用程序来卸载应用程序,例如App Cleaner Uninstaller 要删除 Adobe 产品,请使用 Creative Cloud Cleaner Tool

  • 需要远程帮助吗?

    网站已开通永久会员的可享受免费远程,如果非永久会员,远程安装另外收费

点点赞赏,手留余香

给TA打赏
共0人
还没有人赞赏,快来当第一个赞赏的人吧!
    技术教程

    第七章丨C++编程宝典:快速上手、深入进阶、挑战高级技巧,助你成为编程达人

    2024-1-30 11:30:37

    技术教程

    第九章丨C++编程宝典:快速上手、深入进阶、挑战高级技巧,助你成为编程达人

    2024-1-31 10:50:55

    0 条回复 A文章作者 M管理员
    早知如此绊人心,何如当初莫相识
    欢迎您,新朋友,感谢参与互动!
      暂无讨论,说说你的看法吧
    后退
    榜单