C语言中的static
C语言中没有类的概念,即没有静态成员一说,在c中static的作用主要有2个:
1、隐藏功能,对于static修饰的函数和全局变量而言;
2、保持持久性功能,对于static修饰的局部变量而言。
因为存放在静态区,全局和局部的static修饰的变量,都默认初始化为0。
C语言中使用静态函数的好处:
静态函数会被自动分配在一个一直使用的存储区,直到退出应用程序实例,避免了调用函数时压栈出栈,速度快很多。
内部函数又称静态函数。“static”的含义不是指存储方式,而是指对函数的作用域仅局限于本文件。
使用内部函数的好处是:不同的人编写不同的函数时,不用担心自己定义的函数,是否会与其它文件中的函数同名,因为同名也没有关系。
c语言中static的语义
1.static变量:
1)局部
a.静态局部变量在函数内定义,生存期为整个源程序,但作用域与自动变量相同,只能在定义该变量的函数内使用。退出该函数后,尽管该变量还继续存在,但不能使用它。
b.对基本类型的静态局部变量若在说明时未赋以初值,则系统自动赋予0值。而对自动变量不赋初值,则其值是不定的。
2)全局
全局变量本身就是静态存储方式,静态全局变量也是静态存储方式。
非静态全局变量的作用域是整个源程序(多个源文件可以共同使用);
静态全局变量只在定义该变量的源文件内有效,在同一源程序的其它源文件中不能使用它。
2.static函数(也叫内部函数)
只能被本文件中的函数调用,而不能被同一程序其它文件中的函数调用。区别于一般的非静态函数(外部函数) static在c里面可以用来修饰变量,也可以用来修饰函数。 变量在c里面可分为存在全局数据区、栈和堆里(平时所说的堆栈是栈而不包含堆)。
C++中的静态成员
在c++中,由于面向对象的思维,有了类中静态成员的说法。静态成员不属于对象,而属于类,不创建对象也可调用。
普通类成员函数与静态成员函数的区别:
普通成员函数有一个隐藏的调用参数(this)指针。所以就是说静态成员函数没有对象也可调用。但他们都是在编译期就进行地址绑定的。
虚拟成员函数与他们的区别在于虚拟函数是对象生成时有对象的虚表决定的(所以是动态的)。
对类的静态和非静态函数的不同的调用要求决定了它们在使用上的方便程度:非静态成员函数要通过对象调用,所以要求首先建立一个对象;而静态成员函数可不建立对象就可以被使用。因此,与类的非静态数据成员无关的成员函数,虽然可以被定义为非静态函数,但是如果定义为静态函数的话在使用上会更加方便。
另外,如果类的成员函数想作为回调函数来使用,一般情况下只能将它定义为静态成员才行。
C++类中的静态成员有一个非常好的功能,那就是无论类定义了多少个对象,这些对象始终都共同使用这一个静态成员