C++中static变量的妙用
static是静态的意思。静态变量曾经被认为是危险的。比如,在许多平台上printf函数有警告,就是因为printf函数中使用了静态变量。
但是,static有着许多“鬼手”,吸引着众多程序探险家。
1、 如何使一段代码在一个线程里仅执行一次
方案一、
void func()
{
static bool b=true;
if(b)
{
std::cout << "Hello World!" << std::endl;//在一个线程里仅执行一次的代码段
b=false;
}
}
哈哈,功能实现了。真正高兴的事情在后面!
方案二、
unsigned char Hello()//在一个线程里仅执行一次的代码段(可以根据实际情况决定是否inline)
{
std::cout << "Hello World!" << std::endl;
return 0;
}
void func()
{
static unsigned char uc=Hello();
}
这样用static才高效,才酷!
2、 消除全局对象的依赖
全局对象的依赖问题一直困扰着C++程序。很多C++书籍会告诉你,“除非万不得已,不要使用全局对象。”但是,全局对象有着众多好处。下面让我们来用static解决部分问题吧。
方案一、
#include <iostream>
int &A(){static int result;return result;}
int main(int argc,char *argv[])
{
A()=123456;
std::cout << A() << std::endl;
}
用起来就像一个全局变量,下面还有更好的办法。
方案二、
#include <iostream>
template <typename T,unsigned>
T & Static(){static T result;return result;}
#define STATIC(T,u) (Static<T,u>())
int main(int argc,char *argv[])
{
STATIC(int,0) = 123;
STATIC(int,1) = 456;
std::cout << STATIC(int,0) << std::endl;
std::cout << STATIC(int,1) << std::endl;
}
将static和模板一起使用,才显得肚子里的知识多啊。O(∩_∩)O。
在C++中static的常规用法网上讲的很全,搜“C++ static”就可以了。