【C++】静态成员函数 ( 静态成员函数概念 | 静态成员函数声明 | 静态成员函数访问 | 静态成员函数只能访问静态成员 )

╰+哭是因爲堅強的太久メ 2023-10-16 13:08 92阅读 0赞

文章目录

  • 一、静态成员函数简介
    • 1、静态成员函数概念
    • 2、静态成员函数声明
    • 3、静态成员函数访问
    • 4、静态成员函数只能访问静态成员
  • 二、代码示例 - 静态成员函数

一、静态成员函数简介


1、静态成员函数概念

静态成员函数归属 : 在 C++ 类中 , 静态成员函数 是一种 特殊的函数 , 该函数属于类 , 而不是属于 类实例对象 ;

静态成员函数调用不依赖于对象 : 即使 没有创建 类 的 实例对象 , 也可以 通过 类名:: 调用 类中定义的 静态成员函数 ;

静态成员函数作用 : 静态成员函数 通常用于 执行与类本身相关的操作 , 执行该函数 不涉及到 类实例对象中的信息 , 也不能在 静态成员函数 中访问 普通的 成员变量 和 成员函数 ;

2、静态成员函数声明

静态成员函数声明 : 使用 static 关键字 修饰 成员函数 , 就可以将 普通的成员函数 转为 静态成员函数 ;

如 : 下面的 void fun() 普通成员函数 , 在 函数之前添加 static 关键字 , static void fun() 就变成了 静态成员函数 ;

  1. class Student
  2. {
  3. public:
  4. static void fun()
  5. {
  6. cout << "静态成员函数被调用 : number = " << number << endl;
  7. }
  8. };

3、静态成员函数访问

静态成员函数访问 :

  • 使用 类名 和 域操作符 访问 :

    // 通过 类名:: 调用 静态成员函数

    1. Student::fun();
  • 使用 对象 访问 :

    // 通过 对象. 调用 静态成员函数

    1. s.fun();

4、静态成员函数只能访问静态成员

静态成员函数内容要求 : 静态成员函数 只能访问

  • 静态成员变量
  • 其他静态成员函数

静态成员函数 不能访问 非静态成员变量 或 非静态成员函数 ,

普通的 成员变量 和 成员函数 , 需要 通过 类 的 实例对象 来访问 , 需要 依托于 对象才能存在 ,

而 静态成员函数 可以在 不创建 实例对象的前提下被调用 , 因此 静态成员函数中 不能访问 非静态成员 ;

如果在静态成员函数中 , 访问非静态成员 , 会报如下错误 :

  1. 1>------ 已启动生成: 项目: HelloWorld, 配置: Debug Win32 ------
  2. 1>Hello.cpp
  3. 1>Y:\002_WorkSpace\002_VS\HelloWorld\HelloWorld\Hello.cpp(22,3): error C2597: 对非静态成员“Student::m_age”的非法引用
  4. 1>已完成生成项目“HelloWorld.vcxproj”的操作 - 失败。
  5. ========== 生成: 成功 0 个,失败 1 个,最新 0 个,跳过 0 ==========

在这里插入图片描述

二、代码示例 - 静态成员函数


下面的代码 , 是在 之前 的 静态成员变量 示例代码的基础上 进行的 ;

在 Student 类中定义静态成员函数 , 使用 static 关键字修饰函数 ;

注意 : 不要在 静态函数中 访问 非静态成员 , 否则会报错 “ 对非静态成员“Student::m_age”的非法引用 “ ;

  1. static void fun()
  2. {
  3. // 静态成员函数 中 访问非静态成员会报错
  4. // error C2597: 对非静态成员“Student::m_age”的非法引用
  5. //m_age = 10;
  6. cout << "静态成员函数被调用 : number = " << number << endl;
  7. }

访问 类的 静态成员函数 时 , 可以使用 类名:: 调用 静态成员函数 ;

  1. // 通过 类名:: 调用 静态成员函数
  2. Student::fun();

还可以使用 对象. 调用 静态成员函数 ;

  1. // 通过 对象. 调用 静态成员函数
  2. s.fun();

代码示例 :

  1. #include "iostream"
  2. using namespace std;
  3. class Student
  4. {
  5. public:
  6. // 带参构造函数
  7. Student(int age, int height)
  8. {
  9. m_age = age;
  10. m_height = height;
  11. cout << "执行 Student 的构造函数" << endl;
  12. }
  13. ~Student()
  14. {
  15. cout << "执行 Student 的析构函数" << endl;
  16. }
  17. static void fun()
  18. {
  19. // 静态成员函数 中 访问非静态成员会报错
  20. // error C2597: 对非静态成员“Student::m_age”的非法引用
  21. //m_age = 10;
  22. cout << "静态成员函数被调用 : number = " << number << endl;
  23. }
  24. public:
  25. int m_age; // 年龄
  26. int m_height; // 身高
  27. // 在类内部定义静态成员
  28. static int number;
  29. };
  30. // 在类外部初始化静态成员变量
  31. int Student::number = 1;
  32. int main() {
  33. // I. 静态成员变量
  34. // 使用 域操作符 访问 类静态成员变量
  35. // 类名::静态成员变量名
  36. cout << "Student::number = " << Student::number << endl;
  37. // 在函数中为 类 静态成员变量 赋值
  38. Student::number = 2;
  39. // 创建 Student 类型对象
  40. Student s(10, 150);
  41. // 使用 对象 访问 类静态成员变量
  42. // 对象名称.静态成员变量名
  43. cout << "s.number = " << s.number << endl;
  44. // II. 静态成员函数
  45. // 通过 类名:: 调用 静态成员函数
  46. Student::fun();
  47. // 通过 对象. 调用 静态成员函数
  48. s.fun();
  49. // 控制台暂停 , 按任意键继续向后执行
  50. system("pause");
  51. return 0;
  52. }

执行结果 :

  1. Student::number = 1
  2. 执行 Student 的构造函数
  3. s.number = 2
  4. 静态成员函数被调用 : number = 2
  5. 静态成员函数被调用 : number = 2
  6. 请按任意键继续. . .

在这里插入图片描述

发表评论

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

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

相关阅读

    相关 静态数据成员静态成员函数

    类中的静态成员真是个让人爱恨交加的特性。我决定好好总结一下静态类成员的知识点,以便自己在以后面试中,在此类问题上不再被动。 静态类成员包括静态数据成员和静态函数成员两部分。

    相关 静态成员函数

    静态成员函数 与静态数据成员一样,我们也可以创建一个静态成员函数,它为类的全部服务而不是为某一个类的具体对象服务。静态成员函数与静态数据成员一样,都是类的内部实现,属于类定义