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






    一、静态成员函数简介




    1、静态成员函数概念


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

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


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


    2、静态成员函数声明


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

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

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

    3、静态成员函数访问


    静态成员函数访问 :

    • 使用 类名 和 域操作符 访问 :
    	// 通过 类名:: 调用 静态成员函数
    	Student::fun();
    
    • 1
    • 2
    • 使用 对象 访问 :
    	// 通过 对象. 调用 静态成员函数
    	s.fun();
    
    • 1
    • 2

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


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

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

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

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

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


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

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

    在这里插入图片描述





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



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

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

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

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

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

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

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

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

    代码示例 :

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

    执行结果 :

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

    在这里插入图片描述

  • 相关阅读:
    SpringMVC 解析(四)编程式路由
    【Java第22期】:Thread 类的基本用法
    WIN10 驱动开发环境从0搭建 (驱动开发必看)
    《Linux从练气到飞升》No.30 深入理解 POSIX 信号量与生产消费模型
    Spire.Office 8.9.3 for .NET cRACK
    信息系统项目管理师 第四版 第2章 信息技术发展
    我的第一个项目(三):注册登陆功能(后端)
    DOS之特殊符号讲解
    scrapy的入门使用
    LeetCode704.二分查找及二分法
  • 原文地址:https://blog.csdn.net/han1202012/article/details/133187910