c语言关于中static
在C语言中static既可以修饰变量也可以修饰函数。static修饰变量又分为修饰局部变量和修饰全局变量。static修饰函数改变的是函数的链接属性。
一、static修饰局部变量,改变变量的生命周期,作用域不发生变化。
局部变量定义在函数内部,在调用函数时给变量分配栈空间,函数调用结束,释放该变量空间。但是加上static修饰称为静态局部变量。如果我们希望函数调用结束之后,局部变量的值不会消失,而是保留上一次函数调用结束时的值,即变量占用的空间不被释放。在下一次调用该函数是,改变了的值就是上一次调用结束时候的值,就可以声明为静态局部变量。
(1)静态局部变量在静态存储区(数据段)内分配存储单元。在程序整个运行期间都不会释放。而自动变量(动态局部变量)属于动态存储方式(栈),函数调用结束之后就释放。
(2)静态局部变量是在编译期间赋初值,即只赋一次,在程序运行时,他已经有了初值。以后每次调用函数时,不在对该变量重新赋值。而自动变量是在函数调用时赋初值,每调用一次赋初值一次。
(3)如果在定义局部变量不初始化,静态局部变量会默认初值为0,而自动变量为随机值。
(4)函数调用结束后,静态局部变量不释放,但是其他函数不可以使用该局部变量。
二、static修饰全局变量,作用域仅限于本文件,其他文件使用extern也不可以。
静态全局变量:作用域仅限于变量被定义的文件中,其他文件即使使用extern也没有办法使用它。准确的说作用域是从定义之处开始,带文件结尾处结束,在定义之处前面的那些代码也不可以使用它,如果想要使用必须加extern声明。
全局变量(未加static)和静态全局变量都存储于数据段。
三、static修饰函数,改变链接属性
我们一般写的函数都是具有外部链接属性,但是加上static修饰就只能在本文件内使用也就是具有内部链接属性。
注:以上只要具有外部链接属性就可以使用extern修饰声明在其他文件内使用,除非加上static限制了链接属性。
C++中static
c++中兼容了C语言的static。除此之外增加了(静态成员)static修饰类的静态成员变量和静态成员函数。类的静态成员一定要在类外初始化。
(1)静态成员是所以类对象共享,不是属于某一个对象。sizeof可以验证。
(2)静态成员变量必须要在类外定义,定义时不加static关键字。
(3)静态成员可以使用类名::静态成员或者对象.静态成员(这种方式底层还是第一种)来访问。
(4)静态成员函数没有this指针,所以在静态成员函数内部不可以调用非静态成员变量,并且不可以使用const修饰。
(5)静态成员和普通成员一样具有访问权限。
class Date{
public:
Date(int year = 1900, int month = 1,int day = 1)
:_year(year)
, _month(month)
, _day(day)
{}
static void display()
{
cout << _count << endl;
}
private:
int _year;
int _month;
int _day;
static int _count;
};
int Date::_count = 0;
int main()
{
Date::display();
Date d1(2018, 11);
Date d2(d1);
d1.display();
Date::display();
return 0;
}
静态成员函数不可以调用非静态成员,因为没有this指针。但是非静态成员函数可以调用静态成员。
静态成员变量和普通成员变量区别?
(1)生命周期
静态成员变量在编译期间创建初始化并且一直存在;
普通成员变量是在创建对象时创建的,对象销毁普通成员变量也销毁。
(2)共享方式
静态成员变量属于类,而不是具体的属于某一个对象,sizeof求大小并不包含静态成员变量。
普通成员变量属于某个具体的对象所有。
静态成员函数和普通成员函数区别?
(1)静态成员函数没有this指针,不可以访问普通成员。但是普通成员变量可以访问任何成员
(2)静态成员函数不可以用const修饰,但是普通成员函数可以。