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





一、静态成员函数简介




1、静态成员函数概念


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

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


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


2、静态成员函数声明


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

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

class Student
{
    
    
public:
	static void fun()
	{
    
    
		cout << "静态成员函数被调用 : number = " << number << endl;
	}
};

3、静态成员函数访问


静态成员函数访问 :

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

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==========

在这里插入图片描述





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



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

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

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

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

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

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

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

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

代码示例 :

#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;
}

执行结果 :

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

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/han1202012/article/details/133187910