1在固定地址上分配
2,对一个特定编译单元来说是本地的
#include <iostream>
#include <string>
using namespace std;
char onechar(const char* string = 0)
{
static const char* s;
if (string) { s = string; return *s; }
if (*s == '\0') return 0;
return *s++;
}
const char *a="abcdefghijkmnopqrstuvwxyz";
int main()
{
onechar(a);
char c;
while ((c = onechar()) != 0)
cout << c << endl;
return 0;
}
这里以前版本
if (string) { s = string; return *s; }
else s = "un-initialized s";
上面会主次输出a的值,下面的则会一直输出u因为我是根据string判断的,可以对static const char* 进行更改,因为他是一个指向常量的指针,而不是一个常量,另外一个方面,我的s值由于是在静态区域的,所以他的值是在程序进行过程中保持的,这个变量在程序运行过程中一直存在,而不会实在第二次进入函数就重新创建得到一个未定义的值。我还尝试在main中输出s,但是s视为定义的,也就是生存是整个程序运行时间,但是作用范围没有变化。
在自定义静态变量是要注意构造函数中的缺省构造和析构函数,可以使用axexit跳出main。静态变量的销毁是按找构造的反顺序进行的
#include <fstream>
#include <iostream>
using namespace std;
ofstream out("statdest.out");
class obj
{
char c;
public:
obj(char C) :c(C) {
out << "obj::obj() for " << c << endl;
}
~obj() {
out << "obj::~obj() for" << c << endl;
}
};
obj A('A');
void f()
{
static obj B('B');
}
void g()
{
static obj C('C');
}
int main()
{
out << "inside main()" << endl;
f();
out << "leAAVING MAIN" << endl;
}
result
obj::obj() for A
inside main()
obj::obj() for B
leAAVING MAIN
obj::~obj() forB
obj::~obj() forA
内联函数
内联函数在适当时像宏一样展开,所以函数调用的开销被取消
任何类内定义函数自动成为内敛函数,但也可以使用inline关键字放在类外定义的函数前面是指成为内敛函数。为了是指有效,必须函数提和声明结合在意其,否则编译时按普通函数处理