static(C语言和C++)汇总

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修饰,但是普通成员函数可以。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

weixin_41318405

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值