文章目录
- 一、静态成员函数简介
- 1、静态成员函数概念
- 2、静态成员函数声明
- 3、静态成员函数访问
- 4、静态成员函数只能访问静态成员
- 二、代码示例 - 静态成员函数
一、静态成员函数简介
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
请按任意键继续. . .