前行的路上你是否孤单过,穿梭在这个城市,累了吗,醒了吗,醒了就继续前行吧。
一、
1、static的第一个作用是隐藏:当我们要编译多个文件时,所有未加static前缀的全局变量和函数都具有全局可见性。当在全局变量和函数前加上“static”前缀后,就会对其他源文件隐藏。利用这一个特征可以在不同的文件中定义同名函数和同名变量,而不必担心命名冲突。
2、static的第二个作用是默认初始化为0,包括未初始化的全局静态变量与局部静态变量。在C语言中,未初始化的静态变量(全局/局部)放在内存的BSS段,而初始化了的放在内存的数据段。其实,全局变量即使不定义为静态,也是会自动被初始化的;而局部变量则不同----局部变量如果是内置类型则不会被初始化,注意,如果只被初始化了一部分,那么其后面的部分将会被初始化为0;如果变量不是内置类型,则不管其在哪定义,都会自动调用其默认构造函数进行初始化。这样讲也许还不会清楚,来看下面的例子:
static int a; int b; string s1[10]; int main() { static int c; int d;
string s2[10]; return 0; }
a、b和c被初始化为0;d为函数体内定义的内置类型,元素未被初始化,值不确定; s1和s2为元素类型string的数组,自动调用string类的默认构造函数将各个元素初始化为空字符串;
3、static的第三个作用是保持局部变量内容的持久
不加static前缀的变量,会跟随函数生存期的结束而结束,但是带有static前缀的变量不会;静态局部变量的生存周期虽然为整个源程序,但其作用域仍与局部变量相同,即只能在定义改变量的函数内使用该变量;
二、类中的static的作用
c++重用了static这个关键字,并赋予它与前面不同的含义:表示属于一个类而不是属于此类的任何特定对象的变量和函数;
1、静态数据成员
静态数据成员和普通数据成员一样遵守public,protected,private访问规则。静态数据成员只和类关联,而不和特定的对象关联。静态数据成员也存储在全局存储区;静态数据成员定义时要分配空间,所以不能在类声明中定义。static数据成员必须在类定义体的外部定义。
下面来举个例子吧,例子是之前在百度百科中看到的,理解起来也好理解的;看下面
#include <iostream.h> class Myclass { public: Myclass(int a,int b,int c); void GetSum(); private: int a,b,c; static int Sum;//声明静态数据成员 }; int Myclass::Sum=0;//静态数据成员的初始化 Myclass::Myclass(int a,int b,int c) { this->a=a; this->b=b; this->c=c; Sum+=a+b+c; } void Myclass::GetSum() { cout<<"Sum="<<Sum<<endl; } int main() { Myclass M(1,2,3); M.GetSum(); Myclass N(4,5,6); N.GetSum(); M.GetSum(); return 0; }
输出结果是:
Sum=6
Sum=21
Sum=21
第一个输出结果是对象M成员和,第二个和第三个输出结果是对象M和N的和,可以看出对象M和N公用了静态数据成员Sum;
2、静态成员函数
静态成员函数的特点:
(1)、静态成员函数和普通成员函数相比较,普通的成员函数都隐含着一个this指针,而静态成员函数不包含这个this指针,所以静态成员函数无法访问属于类对象的非静态数据成员,也无法访问非静态成员函数。它只能调用其它的静态数据成员和静态成员函数。
(2)、静态成员函数只能访问其它的静态成员函数和静态数据成员,而不能访问非静态数据成员和非静态成员函数。但是非静态成员函数可以访问静态成员函数和静态数据成员。
(3)、由于没有this指针的额外开销,所以静态成员函数相比与类的非静态成员函数速度上会有少许的增长。