static
static变量特点(static方法类似):
1)static变量在全局数据区分配内存,并始终驻留在全局数据区,直到程序运行结束。
2)静态全局变量在声明它的整个文件都是可见的,而在文件之外是不可见的,这样可避免不同文件中的命名冲突。
3)静态变量一般在声明处初始化,如果没有显式初始化,会被程序自动初始化为0。
好处: 静态全局变量不能被其它文件所用;其它文件中可以定义相同名字的变量,不会发生冲突。
面向对象的static特点:
1) 出现在类体外的函数定义不能指定关键字static;
2)静态成员之间可以相互访问,包括静态成员函数访问静态数据成员和访问静态成员函数;
3)非静态成员函数可以任意地访问静态成员函数和静态数据成员;
4)静态成员函数不能访问非静态成员函数和非静态数据成员;
5)由于没有this指针的额外开销,因此静态成员函数与类的全局函数相比速度上会有少许的增长;
6)调用静态成员函数,可以用成员访问操作符(.)和(->)为一个类的对象或指向类对象的指针调用静态成员函数,也可以直接使用如下格式:
<类名>::<静态成员函数名>(<参数表>) //调用类的静态成员函数。
例子:
#include<iostream> using namespace std; class myclass { private: int a; static int b; //声明静态数据成员,不可在声明时初始化 static int c; //声明静态数据成员,不可在声明时初始化 static const int d=10; //声明静态const数据成员,可在声明时初始化 public: int fun1(); static int fun2(); }; int myclass::b = 0; //定义并初始化静态数据成员,不能出现static int myclass::fun1() { this->a = 10; this->c = 20; //非static函数可操作static变量 cout<<"a="<<a<<endl; cout<<"c="<<c<<endl; return 0; } int myclass::fun1() { //a = 10; static函数不可操作非static变量 c = 100; //cout<<"a="<<a<<endl; cout<<"b="<<b<<endl; cout<<"c="<<c<<endl; return 0; } int main(void) { myclass A; A.fun1(); A.fun2(); //myclass::fun1(); //错 myclassfun2(); return 0; }