C++第九篇:静态函数
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
目录
一、C中的静态函数
1.修饰局部变量
2.修饰全局变量
3.修饰函数
二、C++中的静态函数
1.特点:
2.代码示例
一、C中的静态函数
1.修饰局部变量
作用:会延长局部变量的生存周期。
2.修饰全局变量
作用:普通全局变量具有外部链接属性,只要在其他源文件中通过extern
声明,就可以使用该变量。而被static
修饰的全局变量,其外部链接属性变为内部链接属性,作用域被限制在定义它的源文件内部,其他源文件无法通过extern
声明来访问该变量 。
3.修饰函数
作用:限制函数的作用域,使得该静态函数只能在其定义所在的源文件(.c
文件)内部被调用,而不能在其他源文件中通过外部链接来使用。
就是说:对于局部变量,声明周期延长。而对于全局变量和函数而言,是将其定定义内部的,只能在文件(.c文件)内部调用,这样做有两个好处:
1.避免命名冲突:当多个源文件存在相同名称的函数时,将这些函数声明为静态函数,就不会因为函数名相同而在链接时产生冲突。
2.隐藏实现细节:可以把一些只在当前源文件内部使用、不需要被其他源文件访问的函数定义为静态函数,从而将函数的实现细节隐藏起来。
二、C++中的静态函数
1.特点:
- 静态成员变量属于类,只要类存在,静态成员变量就存在
- 同一类的所有对象共享静态成员变量
- 静态成员变量必须在类外进行初始化
- 静态成员变量可以直接通过类名访问(也可以通过对象进行访问)
就是说和静态成员变量只能通过类或对象访问,并且生命周期和程序相同,需要记得初始化静态成员变量。
2.代码示例
#include <iostream>
using namespace std;class Student {
private:string name; // 普通成员变量static int totalCount; // 静态成员变量(所有对象共享)public:Student(string n) : name(n) {totalCount++; // 每次创建对象,总数加1}// 静态成员函数(可访问静态成员变量)static int getTotalCount() {return totalCount;}
};// 静态成员变量必须在类外初始化
int Student::totalCount = 0;int main() {Student* p1 = new Student("Alice");Student* p2 = new Student("Bob");// 通过类名访问静态成员(也可通过对象访问,但不推荐)cout << "学生总数:" << Student::getTotalCount() << endl; // 输出:2// 释放动态分配的内存delete p1;delete p2;Student s1("Charlie");cout << "学生总数:" << Student::getTotalCount() << endl; // 输出:3return 0;
}
结果如下:

可以发现,不论代码中是否有这个对象存在,这个静态成员变量始终保存在内存当中。这里再次强调,记得初始化静态成员变量。