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;
}