c++++ 中 static 关键字应用于函数可实现以下场景:定义私有或受保护的类方法,以实现类内或派生类访问;创建全局函数,使函数可以在程序任意位置访问;创建线程安全的函数,确保并发环境中的安全使用。
C++ 函数 static 关键字的应用场景
static
关键字在 C++ 中广泛用于函数声明中,它控制函数作用域和生存期。下面列出一些主要的应用场景:
1. 定义私有或受保护的类方法
static
函数可以被声明为私有或受保护的,这意味着它们只能在该类内部访问或派生类中访问。这对于创建仅用于内部管理的实用程序函数很有用。
2. 创建全局函数
static
函数可以以全局作用域定义,这意味着它们可以在程序的任何地方访问。这对于创建库函数或实用程序函数非常有用。
3. 创建线程安全的函数
static
函数是线程安全的,这意味着它们可以在并发环境中安全使用。这是因为它们只存在单个副本,不会因并发访问而修改。
实战案例:
私有静态函数:
class MyClass {
public:
void foo() {
static int count = 0; // 私有静态变量
count++;
std::cout << "Call count: " << count << std::endl;
}
};
int main() {
MyClass obj;
obj.foo(); // 输出:Call count: 1
obj.foo(); // 输出:Call count: 2
// count 变量只在 foo() 方法中可见,不能从主函数中访问。
}
受保护的静态函数:
class Base {
protected:
static int value; // 受保护静态变量
};
class Derived : public Base {
public:
static void set_value(int v) {
Base::value = v; // 可以访问基类的受保护静态成员
}
static int get_value() {
return Base::value; // 可以访问基类的受保护静态成员
}
};
int main() {
Derived::set_value(100);
std::cout << "Value: " << Derived::get_value() << std::endl; // 输出:Value: 100
// 只能通过 Derived 类访问 value 变量,因为它继承了 Base 类。
}
全局静态函数:
static int global_count = 0; // 全局静态变量
int increment_count() {
return ++global_count; // 返回并递增全局计数器
}
int main() {
std::cout << increment_count() << std::endl; // 输出:1
std::cout << increment_count() << std::endl; // 输出:2
// 全局计数器在程序的整个生命周期中都可以访问。
}
线程安全的静态函数:
class ThreadSafeClass {
public:
static int get_random_number() {
static std::random_device rd; // 静态随机数生成器
static std::mt19937 gen(rd());
return gen();
}
};
int main() {
std::thread t1([] {
for (int i = 0; i < 10000; i++) {
ThreadSafeClass::get_random_number();
}
});
std::thread t2([] {
for (int i = 0; i < 10000; i++) {
ThreadSafeClass::get_random_number();
}
});
t1.join();
t2.join();
// 即使从多个线程并发访问,get_random_number 函数也能生成线程安全的随机数。
}