static修饰函数
静态成员函数
作用:调用这个函数不会访问或者修改任何对象(非static)数据成员。换言之,静态成员函数与类的实例无关。可以直接通过类名字调用静态成员函数,不需要进行类的实例化。
有以下特点:
- 静态成员函数可以访问类的静态成员变量,但不能访问非静态成员变量。这是因为静态成员函数没有隐式的this指针,它们不与任何特定的对象相关联。
- 静态成员函数在内存中只有一份副本,无论创建多少个类的对象,它们都共享同一个静态成员函数。
- 静态成员函数可以在类的外部定义,但在定义时不需要加上static关键字。
例子:
class MyClass {
public:
static void staticFunc() {
// 静态成员函数的定义
}
};
// 在类外部定义静态成员函数
void MyClass::staticFunc() {
// 静态成员函数的定义
}
可以通过以下方式来调用静态成员函数:
MyClass::staticFunc(); // 直接通过类名调用静态成员函数.
全局静态函数
在全局作用域中定义的静态函数可以在整个程序中访问,而不需要通过类名或对象来调用。它们可以在任何地方被调用,只要它们在调用点之前已经被声明或定义。
跨文件访问
要在一个文件中调用另一个文件中定义的全局静态函数,需要在调用点之前声明该函数。这可以通过在调用文件中使用函数原型(函数声明)来实现。函数原型告诉编译器函数的名称、参数类型和返回类型,以便在编译时进行类型检查。
下面是一个示例,展示了如何在不同的文件中定义和调用全局静态函数:
File1.cpp:
// 在 File1.cpp 中定义全局静态函数
static void globalStaticFunc() {
// 静态函数的定义
}
File2.cpp:
// 在 File2.cpp 中声明全局静态函数
static void globalStaticFunc(); // 函数原型
int main() {
// 调用全局静态函数
globalStaticFunc();
return 0;
}
在File2.cpp中,我们通过函数原型声明了File1.cpp中定义的全局静态函数。这样,编译器就知道在调用点之前有一个名为globalStaticFunc的函数存在。
通过这种方式,我们可以在不同的文件中定义和调用全局静态函数,实现跨文件的访问。
static修饰变量
当static关键字用于修饰变量时,它具有不同的含义和用法。在C++中,static关键字可以用于以下两种情况:
静态局部变量(Static Local Variables)
当static关键字用于函数内部的变量时,它会将该变量声明为静态局部变量。静态局部变量在函数第一次被调用时初始化,并且在整个程序的执行期间保持其值。与普通局部变量不同,静态局部变量的生命周期不会随着函数的调用结束而结束。
静态局部变量对于在函数调用之间保持数据的持久性非常有用。它们通常用于需要在多次函数调用之间保持状态的情况。
以下是一个示例,展示了如何声明和使用静态局部变量:
void myFunction() {
static int count = 0; // 静态局部变量的声明和初始化
count++; // 对静态局部变量进行操作
// 其他代码...
}
静态成员变量(Static Member Variables)
当static关键字用于类的成员变量时,它会将该变量声明为静态成员变量。静态成员变量属于整个类,而不是类的实例。它们在内存中只有一份副本,被所有类的实例共享。
静态成员变量通常用于存储与类相关的数据,而不是与类的每个实例相关的数据。它们可以通过类名和作用域解析运算符(::)来访问。
以下是一个示例,展示了如何声明和使用静态成员变量:
class MyClass {
public:
static int count; // 静态成员变量的声明
};
// 在类外部初始化静态成员变量
int MyClass::count = 0;
int main() {
MyClass::count++; // 访问静态成员变量并进行操作
// 其他代码...
return 0;
}
总结
当static关键字用于函数或变量时,它们的内存分配和初始化时间取决于它们的上下文和作用域。
对于静态局部变量(Static Local Variables)和静态成员变量(Static Member Variables),它们在编译时被分配内存,并在程序运行之前进行初始化。静态局部变量在函数第一次被调用时初始化,而静态成员变量在程序启动时初始化。
对于静态局部变量,它们的初始化只会在第一次函数调用时发生,之后的函数调用不会再次初始化。静态成员变量只会在程序启动时进行一次初始化,而不会随着类的实例化而重复初始化。
对于静态函数(Static Functions),它们不会分配内存,因为它们不属于任何对象或实例。静态函数只是与类相关联的函数,可以直接通过类名来调用。它们在编译时就已经存在,并且可以在程序运行时被调用。
需要注意的是,静态函数和静态变量的初始化顺序是不确定的,因为它们可能位于不同的编译单元中。因此,在使用静态变量的静态函数中,应该小心处理初始化顺序的问题。
总结起来,静态局部变量和静态成员变量在编译时分配内存并进行初始化,而静态函数在编译时存在,并在程序运行时可被调用。