c/c++中的static
static关键字常用功能
1.局部静态变量
这个很简单的说就是某个作用内部的变量加上static,比如函数内部的一个static变量。
特点:局部作用域,全局生命周期。不可重入。
用处:记录下某些函数调用的次数之类的。
这样的用法最好是不要使用,因为不可重入性,容易在多线程程序中出错。
2.外部静态函数或变量
这个经常使用,这是一种c的方式的用法,主要是避免污染命名空间。这是就是限制作用域了。
比如在file1.cpp
namespace n1 {
static const std::string test_img = "../../1.jpg";
} // namespace n1
在file2.cpp
namespace n1 {
static const std::string test_img = "../../test.jpg";
} // namespace n1
这样可以在不同文件使用相同的变量名,而不造成命名空间的污染。
还有一个作用,就是用static修饰外部函数,就是让这个函数只能在这个文件内部使用。
应用场景:通常我们在file1.cpp
实现了一个函数.
namespce n1 {
void func1() {
// ....
}
} // namespace n1
如果我们在file2.cpp
也有使用到相应的功能,我们只需要在file2.cpp
加上extern
关键字就好了。
namespce n1 {
extern void func1()
} // namespace n
但是如果外部函数或者变量加上static就是能使用extern了。
3.类内部的变量或函数加上static
这个用法也经常用而且比较简单,比如内部的变量加上static可以用于单例模式中的懒汉模式。 这有特点就是需要内部声明,外部初始化。可以用类名直接访问变量。
namespace n1 {
class A {
public:
static int var;
public:
static void func();
};
A::var = 10; // init
}
对于static修饰类的成员函数,就是代表这个类可以通过类名或者对象来使用这个函数。
局限性:
这种方式创建函数,本身是没有this,所以是无法访问非static的类成员或者类成员函数的。但是这种方式也不是绝对的,可以通过反射机制来使得可以使用静态成员函数访问非静态的成员或函数的。
用法都很简单,这里就不举例子了。